Java Thread Life Cycle and Thread States
一个java 线程 在它的生命周期来,可以处于下图的任何一个状态,可以是 New,Runnable,Blocked,Waiting,Timed Waiting 或 Terminated。同业也称为生命周期内的事件。
Java Thread Life Cycle Status
New
在java里面有两种创建线程的方式,一个是继承Thread ,一个是实现Runnalbe 接口:
1 | public class DemoRunnable implements Runnable { |
在调用start方法前,线程都是非活状态
Runnable
调用 start()
方法,使得线程处于Runnable
状态。处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。因为cpu的调度不一定是按照先进先出的顺序来调度的),等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。
线程的调度是依赖于系统平台的,多线程在不同平台下运行可能会有不同行为表现
操作系统从java虚拟机(Java Virtual Machine ,JVM)中隐藏了RUNNABLE and RUNNING states,所以看上去只有Runnable状态
Blocked
当线程企图执行一个无法直接完成的或者必须要临时等待的任务是,一个Runnable 线程将转换为 blocked
状态。
举例,当一个线程需要 输入或者输出时 ,操作系统会block线程,直至I/O操作完成,到那个时候,线程就会从blocked状态转换为Runnabled 状态,这时线程就可以被恢复执行。处于blocked 的线程无法获得处理器资源,哪怕有空闲的处理器。
Waiting
线程可能会因为多样的原因而处于Waiting
状态,比如说调用了它的wait()
方法。通常是因为在线程在执行过程中,必须有其他事项需要前置完成。
一旦线程的wait状态结束,它将转换为Runnable
状态,重新回到可运行池
Timed Waiting
当线程需要等待其他线程执行任务时,它提供了一个可选的等待间隔,一个Runnable线程可以调用它的sleep(long millis)
方法或者wait(long millis)
方法,将状态转变为 Time Waiting
。
处于Time Waiting
状态下的线程,只有被其他线程唤醒或者过了设置的等待时间间隔。处于此状态下的线程,也无法获得处理器资源
Terminated
当成功执行完成它的任务,或者因为某些异常错误而终止,或者被强制杀死,线程就会转入Terminated
状态(也称为 Dead State
)
starvation & deadlock
Please remember that though JVM and OS thread scheduler do their best yet sometimes threads can cause starvation or deadlock. This occurs when a waiting thread (let’s call this thread1) cannot proceed because it’s waiting (either directly or indirectly) for another thread (let’s call this thread2) to proceed, while simultaneously thread2 cannot proceed because it’s waiting (either directly or indirectly) for thread1 to proceed.
Happy Learning !!