线程生命周期
线程状态转换机
- NEW:已经创建但还没启动的新线程。已经做了准备工作,但还没有调用 start()方法。
- RUNNABLE:处于可运行状态的线程正在 JVM 中执行,但它可能正在等待来自操作系统的其他资源,例如处理器。
# Java 中的 RUNNABLE 状态对应操作系统中的两种状态
* Ready:等待分配CPU时间片。
* Running:执行中。
- BLOCKED:进入 synchronized 修饰的代码块或方法,等待获取 monitor 锁之后进入 RUNNABLE。
- WAITING:Object.wait()、join()、 LockSupport.park(),进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
- TIME_WAITING:Object.wait(time)、Thread.join(time)、LockSupport.parkNanos(time)、LockSupport.parkUntil(time),该状态不同于 WAITING,它可以在指定的时间内自行返回。
- TERMINATED:表示该线程已经执行完毕。
BLOCKED 与 WAITING、TIMED_WAITING 的区别?
- BLOCKED 等待另外线程释放排他锁、释放 monitor。
- WAITING、TIMED_WAITING 等待被唤醒,或等待一段设置好的时间。
示例 :NEW 、 RUNNABLE 、 TERMINATED 状态
/**
* 展示:new runnable terminated
* 即使是正在运行 也是 runnable状态,而不是 running
*/
public class NewRunnableTerminated implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(i);
}
}
public static void main(String[] args) {
Thread thread = new Thread(new NewRunnableTerminated());
System.out.println(thread.getState());//NEW
thread.start();//
System.out.println(thread.getState());//RUNNABLE
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.getState());//RUNNABLE,即使是正在运行,也是RUNNABLE,而不是RUNNING
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.getState());//TERMINATED
}
}
NEW
RUNNABLE
0
1
2
RUNNABLE
3
...
999
TERMINATED
示例 :BLOCKED、WAITING、TIMED_WAITING 状态
/**
* 演示:BLOCKED、WAITING、TIMED_WAITING
*/
public class BlockedWaitingTimedWaiting implements Runnable {
static BlockedWaitingTimedWaiting instance = new BlockedWaitingTimedWaiting();
@Override
public void run() {
synchronizedMethod();
}
private synchronized void synchronizedMethod(){
try {
Thread.sleep(2000);
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(instance);
Thread t2 = new Thread(instance);
t1.start();
t2.start();
Thread.sleep(50);
System.out.println(t1.getState());//TIMED_WAITING ( Thread.sleep(time))
System.out.println(t2.getState());//BLOCKED (进入同步代码块被阻塞,等待锁释放)
Thread.sleep(2000);
System.out.println(t1.getState());//WAITING ( wait())
}
}
TIMED_WAITING
BLOCKED
WAITING
阻塞状态是什么?
一般习惯而言、把 BLOCKED、WAITING、TIME_WAITING 都成为阻塞状态。