9. java中线程的生命周期
线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发。
java中Thread的状态
java中Thread有6种状态,分别是:
NEW - 新创建的Thread,还没有开始执行
RUNNABLE - 可运行状态的Thread,包括准备运行和正在运行的。
BLOCKED - 正在等待资源锁的线程
WAITING - 正在无限期等待其他线程来执行某个特定操作
TIMED_WAITING - 在一定的时间内等待其他线程来执行某个特定操作
TERMINATED - 线程执行完毕
我们可以用一个图来直观的表示:

JDK代码中的定义如下:
NEW
NEW 表示线程创建了,但是还没有开始执行。我们看一个NEW的例子:
上面的代码将会输出:
Runnable
Runnable表示线程正在可执行状态。包括正在运行和准备运行两种。
为什么这两种都叫做Runnable呢?我们知道在多任务环境中,CPU的个数是有限的,所以任务都是轮循占有CPU来处理的,JVM中的线程调度器会为每个线程分配特定的执行时间,当执行时间结束后,线程调度器将会释放CPU,以供其他的Runnable线程执行。
我们看一个Runnable的例子:
上面的代码将会输出:
BLOCKED
BLOCKED表示线程正在等待资源锁,而目前该资源正在被其他线程占有。
我们举个例子:
上面的例子中,由于t1是无限循环,将会一直占有资源锁,导致t2无法获取资源锁,从而位于BLOCKED状态。
我们会得到如下结果:
WAITING
WAITING 状态表示线程正在等待其他的线程执行特定的操作。有三种方法可以导致线程处于WAITTING状态:
object.wait()
thread.join()
LockSupport.park()
其中1,2方法不需要传入时间参数。
我们看下使用的例子:
在这个例子中,我们调用的t2.join(),这会使调用它的t1线程处于WAITTING状态。
我们看下输出结果:
TIMED_WAITING
TIMED_WAITING状态表示在一个有限的时间内等待其他线程执行特定的某些操作。
java中有5中方式来达到这种状态:
thread.sleep(long millis)
wait(int timeout) 或者 wait(int timeout, int nanos)
thread.join(long millis)
LockSupport.parkNanos
LockSupport.parkUntil
我们举个例子:
上面的例子中我们调用了Thread.sleep(5000)来让线程处于TIMED_WAITING状态。
看下输出:
那么问题来了,TIMED_WAITING和WAITTING有什么区别呢?
TIMED_WAITING如果在给定的时间内没有等到其他线程的特定操作,则会被唤醒,从而进入争夺资源锁的队列,如果能够获取到锁,则会变成Runnable状态,如果获取不到锁,则会变成BLOCKED状态。
TERMINATED
TERMINATED表示线程已经执行完毕。我们看下例子:
输出结果:
本文的例子可以参考https://github.com/ddean2009/learn-java-concurrency/tree/master/thread-lifecycle
更多教程请参考 flydean的博客
最后更新于
这有帮助吗?