9. java中线程的生命周期

线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发。

java中Thread的状态

java中Thread有6种状态,分别是:

  1. NEW - 新创建的Thread,还没有开始执行

  2. RUNNABLE - 可运行状态的Thread,包括准备运行和正在运行的。

  3. BLOCKED - 正在等待资源锁的线程

  4. WAITING - 正在无限期等待其他线程来执行某个特定操作

  5. TIMED_WAITING - 在一定的时间内等待其他线程来执行某个特定操作

  6. TERMINATED - 线程执行完毕

我们可以用一个图来直观的表示:

JDK代码中的定义如下:

NEW

NEW 表示线程创建了,但是还没有开始执行。我们看一个NEW的例子:

上面的代码将会输出:

Runnable

Runnable表示线程正在可执行状态。包括正在运行和准备运行两种。

为什么这两种都叫做Runnable呢?我们知道在多任务环境中,CPU的个数是有限的,所以任务都是轮循占有CPU来处理的,JVM中的线程调度器会为每个线程分配特定的执行时间,当执行时间结束后,线程调度器将会释放CPU,以供其他的Runnable线程执行。

我们看一个Runnable的例子:

上面的代码将会输出:

BLOCKED

BLOCKED表示线程正在等待资源锁,而目前该资源正在被其他线程占有。

我们举个例子:

上面的例子中,由于t1是无限循环,将会一直占有资源锁,导致t2无法获取资源锁,从而位于BLOCKED状态。

我们会得到如下结果:

WAITING

WAITING 状态表示线程正在等待其他的线程执行特定的操作。有三种方法可以导致线程处于WAITTING状态:

  1. object.wait()

  2. thread.join()

  3. LockSupport.park()

其中1,2方法不需要传入时间参数。

我们看下使用的例子:

在这个例子中,我们调用的t2.join(),这会使调用它的t1线程处于WAITTING状态。

我们看下输出结果:

TIMED_WAITING

TIMED_WAITING状态表示在一个有限的时间内等待其他线程执行特定的某些操作。

java中有5中方式来达到这种状态:

  1. thread.sleep(long millis)

  2. wait(int timeout) 或者 wait(int timeout, int nanos)

  3. thread.join(long millis)

  4. LockSupport.parkNanos

  5. 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的博客

最后更新于

这有帮助吗?