Thread类

Thread的生命周期

new状态

  即通过new关键字创建的一个Thread对象,此时与一个普通的Java对象无异。

Runnable状态

  就绪状态,线程通过调用start方法后,不会立即被CPU执行,而是具备可执行的资格,期间等待CPU资源。

Running状态

  运行状态,此时才执行线程的逻辑代码。同时,running状态下的线程也是runnable状态的(CPU的高速切换执行),但反过来不成立。

Blocked状态

  阻塞状态只有在running状态下才会进入(出现),即

  • 线程逻辑中调用sleep、wait方法。
  • 进行某个阻塞的IO操作
  • 等待获取某个锁资源,从而加入了该锁的阻塞队列

Terminated状态

线程死亡状态,如线程正常结束,运行出错,jvm崩溃等。死亡的线程不能在转换到任何其他状态,也不能被重新启动start[详情见start()方法源码)]。

start方法和run方法的关系:模板设计模式

  以jdk1.8.0_191源码为例,看一下Thread.start()的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public synchronized void start() {
// 判断线程状态,不允许已经启动的线程被再次启动,就算线程已经死亡。
if (threadStatus != 0)
throw new IllegalThreadStateException();
// 向线程组添加此线程对象,group的来源看init()方法
group.add(this);

boolean started = false;
try {
// JNI方法,将在该方法中调用我们所重写的run方法。
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}

  Thread中的run和start方法是一个经典的模板设计模式,‘父类’编写算法结构代码,‘子类’实现逻辑细节。
在这里,在这里可以看到一个模板设计模式较为简单的例子。

Runnable接口:策略设计模式

首先需要明白的是,创建线程的方式只有一种,即构造Thread。
而Runnable接口则是实现执行单元的一种方式,即实现Runnable接口的run方法。
另一种实现执行单元的方式,则为重写Thread的run方法。

zcolder wechat
写得不好?加我QQ开始喷我!