Java线程状态

image-20200505174459849

Java线程状态

Java线程状态

java线程一共有6种状态

  • New(新建)
  • Runnable(可运行)
  • Blocked(被阻塞)
  • Waiting(等待)
  • Timed waiting(计时等待)
  • Terminated(终止)

转换关系图如下

image-20200505155257484

说明如下:

  1. New:线程创建后但还没开始时的状态就是新建,即new Thread()后线程的状态就是新建,但还没调用start方法。
  2. Runnable:线程一旦调用start()方法,无论是否运行,状态都为Runable,但Runnable是从JVM视图看是处于执行状态,但实际上操作系统可能在等待一些资源,如此时处理器在干其他的,此时Runnable可以分成两个子状态ReadyRunning,所以通过上图当线程被调度器选中执行实际才处于Running状态。所以显示Runable状态指示表示线程可以运行,不表示线程当下一定在运行,线程是否运行由虚拟机所在操作系统调度决定。
  3. Timed waiting:和wait一样,不过会在传入的时间之后或收到其他线程的通知都会恢复到可运行的状态。
  4. Waiting:当调用下面没有超时时间的方法是线程会转移到Waiting状态
    • Object.wait()
    • Thread.join()
    • LockSupport.park()
  5. Blocked:线程试图获取一个内部对象的Monitor(进入synchronized方法或synchronized块)但是其他线程已经抢先获取,那此线程被阻塞,直到其他线程释放Monitor并且线程调度器允许当前线程获取到Monitor,此线程就恢复到可运行状态。
  6. Terminated:线程执行完毕正常结束或执行过程中因未捕获异常意外终止都会是线程进入被终止状态。

验证DEMO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public class ThreadState {
final static Object o = new Object();
static class MyThread extends Thread {
@Override
public void run() {

try {
Thread.sleep(3000);
synchronized (o){
Thread.sleep(8000);
o.wait();
}
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}


}
}

static class SyncThread extends Thread {
@Override
public void run() {

try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o){
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}


}
}

public static void main(String[] args) throws InterruptedException {
Thread t = new MyThread();
Thread syncThread = new SyncThread();

System.out.println("调用new方法后 my thread state:"+t.getState());

t.start();
System.out.println("调用start方法后 my thread state:"+t.getState());

Thread.sleep(2000);
syncThread.start();

System.out.println("调用sleep方法后 my thread state:"+t.getState());

Thread.sleep(5000);
System.out.println("进入同步代码块 sync thread state:"+syncThread.getState());

Thread.sleep(8000);
System.out.println("调用wait方法后 my thread state:"+t.getState());

Thread.sleep(2000);
synchronized (o){
o.notify();
}

t.join();

System.out.println("调用notify方法后 my thread state:"+t.getState());

}
}

输出结果

1
2
3
4
5
6
调用new方法后 my thread state:NEW
调用start方法后 my thread state:RUNNABLE
调用sleep方法后 my thread state:TIMED_WAITING
进入同步代码块 sync thread state:BLOCKED
调用wait方法后 my thread state:WAITING
调用notify方法后 my thread state:TERMINATED

参考资料:https://www.uml-diagrams.org/java-thread-uml-state-machine-diagram-example.html

- The End -

本文标题:Java线程状态

文章作者:william

发布时间:2020年05月05日 - 15:05

最后更新:2022年02月03日 - 20:02

原始链接:http://wiliam.me/2020/05/05/javaThreadState.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

欣赏此文?求鼓励,求支持!