Java线程状态详解

Java中线程状态

  1. NEW: 线程刚创建,还没有调用start()方法;
  2. RUNNABLE:线程准备就绪状(即:调用start()方法)或运行中;
  3. TIME_WAITING:等待隔一段时间自动唤醒;
  4. WAITING: 等待被唤醒;
  5. BLOCKED:阻塞,正在等待锁;
  6. TERMINATED:线程结束;

线程状态转换图

image.png

代码验证状态转换图

NEW、RUNNABLE、TERMINATED状态

1
2
3
4
5
6
7
8
9
10
11
12
csharp复制代码public class ThreadStatusTest {
public static void main(String[] args) throws Exception {
// NEW、RUNNABLE、TERMINATED
Thread t1 = new Thread(() -> {
System.out.println("2、"+Thread.currentThread().getState()); //线程在执行 输出: RUNNABLE
});
System.out.println("1、"+t1.getState()); //此时还没调用start() 输出: NEW
t1.start(); // 启动t1
t1.join(); // 等待t1线程执行完毕主线程再继续执行
System.out.println("3、"+t1.getState()); //此时t1线程一致性完毕 输出: TERMINATED
}
}

TIMED_WAITING状态

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
scss复制代码public class ThreadTimedWaitingTest {
public static void main(String[] args) throws Exception {
Object o = new Object();

// TIMED_WAITING
Thread t2 = new Thread(() -> {
try {
// 休眠3s
TimeUnit.SECONDS.sleep(3);

synchronized (o) {
// 等待3s
o.wait(3000);
}

Thread thread = new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start(); // 创建一个线程并
thread.join(2000); // thread线程执行完本线程在继续执行

LockSupport.parkNanos(2000000000);

LockSupport.parkUntil(System.currentTimeMillis() + 2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});

t2.start(); // 启动t2
TimeUnit.SECONDS.sleep(1); // 休眠1s保证t2线程启动
System.out.println("4、" + t2.getState()); //输出:4、TIMED_WAITING

TimeUnit.SECONDS.sleep(3); // 休眠2s保证t2线程 wait
System.out.println("5、" + t2.getState()); //输出:5、TIMED_WAITING

TimeUnit.SECONDS.sleep(3); // 休眠3s保证 t2在 join(2000)
System.out.println("6、" + t2.getState()); // 输出: TIMED_WAITING

TimeUnit.SECONDS.sleep(2); // 休眠2s保证 t2在 LockSupport.parkNanos(2000000000);
System.out.println("7、" + t2.getState()); // 输出: 7、TIMED_WAITING

TimeUnit.SECONDS.sleep(1); // 休眠2s保证 t2在 LockSupport.parkUntil(System.currentTimeMillis() + 2000);
System.out.println("8、" + t2.getState()); // 输出: 8、TIMED_WAITING
}
}

WAITING状态

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
scss复制代码public class ThreadWaitingTest {
public static void main(String[] args) throws Exception {
Object o = new Object();
ReentrantLock lock = new ReentrantLock();

Thread t1 = new Thread(() -> {
synchronized (o) {
try {
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}


Thread joinThread = new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
});

try {
joinThread.start();
joinThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

LockSupport.park();

Thread lockThread = new Thread(() -> {
lock.lock();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();

}
});
lockThread.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}

lock.lock();
lock.unlock();
});

t1.start();
TimeUnit.SECONDS.sleep(1); // 休眠1s,保证t1线程 wait()
System.out.println("1、" + t1.getState()); // 输出: 1、WAITING
synchronized (o) {
o.notify();
}

TimeUnit.SECONDS.sleep(1); // 休眠1s, 保证 thread.join();
System.out.println("2、" + t1.getState()); // 输出: 2、WAITING

TimeUnit.SECONDS.sleep(2);// 休眠2s,保证 LockSupport.park();
System.out.println("3、" + t1.getState()); // 输出: 3、WAITING
LockSupport.unpark(t1);

TimeUnit.SECONDS.sleep(2); // 休眠2s, 保证lock.lock();
System.out.println("4、"+t1.getState()); // 输出: 4、WAITING
}
}

BLOCKED

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
java复制代码public class ThreadBlockedTest {

public static void main(String[] args) throws InterruptedException {
Object o = new Object();

Thread t1 = new Thread(() -> {
synchronized (o){
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

Thread t2 = new Thread(() -> {
synchronized (o){

}
});
t1.start();
TimeUnit.SECONDS.sleep(1); // 休眠1s,保证t1执行
t2.start();
TimeUnit.SECONDS.sleep(1);// 休眠1s,保证t2执行
System.out.println(t2.getState()); // 输出: BLOCKED
}
}

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%