进程 系统进行资源分配和调度的基本单位。
线程 偶尔也称作轻量级进程,是程序执行的最小单元。
一个进程中至少有一个线程。
一个线程可以操作另一个线程。
同一个进程中的多个线程可以并发执行。
线程的状态
1.初始状态:线程通过继承或者实现的方式初始化。
2.就绪状态:通过调用线程的start方法(线程中的run()只是一个普通的方法,调用run方法并不会启动一个线程)来启动线程,使线程进入就绪队列,即此时的线程获取了除CPU以外的所有资源,只等待CPU的调用(CPU调用线程并不是按顺序的,即使某些线程有着价高的优先级,也只能说该线程被分配CPU的几率较大,并不代表高优先级一定会被调用)。
3.运行状态:处于就绪队列的线程被分配到CPU后开始执行,运行中的线程能够转换为阻塞,就绪以及死亡状态。
4.阻塞状态:该线程暂时放弃了CPU资源,暂停运行,但是当阻塞原因消失后线程能够重新恢复运行,造成线程阻塞的状态有以下几种(如果不对或者不全面,请大家指正)。
1.线程通过调用sleep()方法进入阻塞状态。
2.线程试图操作一个正在被使用的锁。
3.线程调用一个在I/O上被阻塞的操作,比如等待用户输入(System.in)。
4.线程调用wait()方法,直到其他线程调用了notify()或者调用了notifyAll()方法。
5.死亡状态:线程正常执行直到结束或者一个未被捕获的异常导致程序的停止。
线程的创建
1.继承Thread
public void myThread extends Thread{
public void run(){
//方法体
}
}
2.实现Runable接口
public void myThread implements Thread{
public void run(){
//方法体
}
}
3.实现Callable接口
public void myThread implements Callable<返回值类型>{
public 返回值类型 Call(){
//方法体
}
}
相对于继承以及实现来说,我会选择实现的方式来创建一个线程,因为Java是单继承多实现。
相对于Runable以及Callable方法,当我们的线程需要有返回值或者需要抛出异常的话,就需要实现Callable。