JAVA-Thread 線程的幾種狀態


Oracle JDK 定義中,線程一共有六種狀態

https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html

 

NEW:未啟動狀態

Thread t = new Thread() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
};
System.out.println(t.getState().name());

 

RUNNABLE:可運行狀態

處於可運行狀態的線程正在 Java 虛擬機中執行,但也可能是正在等待來自操作系統資源,例如 CPU。

Thread t = new Thread() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
};
t.start();
System.out.println(t.getState().name());

 

BLOCKED:阻塞狀態

final Object lock = new Object();

Thread t = new Thread() {
    @Override
    public void run() {
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName());
        }
    }
};

synchronized (lock) {
    try {
        t.start();
        Thread.sleep(1000);
        System.out.println(t.getState().name());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

 

WAITING:等待狀態

調用以下方法,使線程處於等待狀態:

Object.wait()、Thread.join()、LockSupport.park()

另一個線程調用以下方法,使線程繼續執行:

notify() 是隨機喚醒的,不同的 JDK 版本,在等待隊列中喚醒的線程,其位置在等待隊列中不同。

JDK1.8 中 notify() 喚醒的是等待隊列中的頭節點(等待時間最長的那個線程)

Object.notify()、 Object.notifyAll()、Thread.join()、LockSupport.unpark(Thread)
final Object lock = new Object();

Thread t = new Thread() {
    @Override
    public void run() {
        try {
            synchronized (lock) {
                lock.wait();
                System.out.println(Thread.currentThread().getName());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
t.start();

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

synchronized (lock) {
    System.out.println(t.getState().name());
    lock.notifyAll();
}

 

TIMED_WAITING:具有指定時間的等待狀態

調用以下方法,使線程處於指定時間的等待狀態:

Thread.sleep()、Object.wait()、Thread.join()、LockSupport.parkNanos()、LockSupport.parkUntil()
Thread t = new Thread() {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
t.start();

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println(t.getState().name());

 

TERMINATED:已終止線程的線程狀態或線程已完成執行

Thread t = new Thread() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
};
t.start();

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println(t.getState().name());

 

線程的狀態圖


https://blog.csdn.net/pange1991/article/details/53860651


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM