目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

线程生命周期

线程状态转换机

线程状态转换机

  • NEW:已经创建但还没启动的新线程。已经做了准备工作,但还没有调用 start()方法。
  • RUNNABLE:处于可运行状态的线程正在 JVM 中执行,但它可能正在等待来自操作系统的其他资源,例如处理器。
1# Java 中的 RUNNABLE 状态对应操作系统中的两种状态
2* Ready:等待分配CPU时间片。
3* 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 状态

 1
 2/**
 3 * 展示:new runnable terminated
 4 * 即使是正在运行 也是 runnable状态,而不是 running
 5 */
 6public class NewRunnableTerminated implements Runnable {
 7
 8    @Override
 9    public void run() {
10        for (int i = 0; i < 1000; i++) {
11            System.out.println(i);
12        }
13    }
14
15    public static void main(String[] args) {
16        Thread thread = new Thread(new NewRunnableTerminated());
17        System.out.println(thread.getState());//NEW
18        thread.start();//
19        System.out.println(thread.getState());//RUNNABLE
20        try {
21            Thread.sleep(1);
22        } catch (InterruptedException e) {
23            e.printStackTrace();
24        }
25        System.out.println(thread.getState());//RUNNABLE,即使是正在运行,也是RUNNABLE,而不是RUNNING
26        try {
27            Thread.sleep(10);
28        } catch (InterruptedException e) {
29            e.printStackTrace();
30        }
31        System.out.println(thread.getState());//TERMINATED
32    }
33}
 1NEW
 2RUNNABLE
 30
 41
 52
 6RUNNABLE
 73
 8...
 9999
10TERMINATED

示例 :BLOCKED、WAITING、TIMED_WAITING 状态

 1/**
 2 * 演示:BLOCKED、WAITING、TIMED_WAITING
 3 */
 4public class BlockedWaitingTimedWaiting implements Runnable {
 5    static BlockedWaitingTimedWaiting instance = new BlockedWaitingTimedWaiting();
 6    @Override
 7    public void run() {
 8        synchronizedMethod();
 9    }
10
11    private synchronized void synchronizedMethod(){
12        try {
13            Thread.sleep(2000);
14            wait();
15        } catch (InterruptedException e) {
16            e.printStackTrace();
17        }
18    }
19
20    public static void main(String[] args) throws InterruptedException {
21        Thread t1 = new Thread(instance);
22        Thread t2 = new Thread(instance);
23        t1.start();
24        t2.start();
25        Thread.sleep(50);
26        System.out.println(t1.getState());//TIMED_WAITING ( Thread.sleep(time))
27        System.out.println(t2.getState());//BLOCKED (进入同步代码块被阻塞,等待锁释放)
28        Thread.sleep(2000);
29        System.out.println(t1.getState());//WAITING ( wait())
30    }
31}
1TIMED_WAITING
2BLOCKED
3WAITING

阻塞状态是什么?

 一般习惯而言、把 BLOCKED、WAITING、TIME_WAITING 都成为阻塞状态。


作者:Soulboy