目录

Life in Flow

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

X

线程生命周期

线程状态转换机

线程状态转换机

  • 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 都成为阻塞状态。


作者:Soulboy