首頁 > 軟體

Java執行緒生命週期圖文詳細講解

2023-10-31 22:00:13

執行緒的狀態

New

  • 表示執行緒已建立,沒啟動的狀態
  • 此時已經做了一些準備工作,還沒有執行run方法中程式碼

Runnable

  • 呼叫start方法之後的狀態,表示可執行狀態(不一定正在執行,因為呼叫start方法之後不一定立即執行)
  • 如果執行緒拿到CPU資源,但是突然資源被搶走,這個執行緒依然處於Runnable

Blocked

  • 執行緒進入到被synchronized修飾的程式碼塊時,該鎖已經被其他執行緒拿走,此時該執行緒處於Blocked
  • Blocked只針對synchronized

Waiting

  • 沒有設定時間引數的Object.wait方法可使執行緒狀態變為waiting

Timed Waiting

  • 相對Waiting,有了時間引數

Terminated

  • 執行完畢
  • run方法正常執行完畢
  • 或者出現了一個沒有被捕獲的異常終止了run方法

程式碼演示

  • 展示執行緒的New、Runnable、Terminated狀態
  • 執行緒剛被new處於NEW狀態
  • 呼叫start方法處於RUNNABLE狀態
  • 程式正在執行處於RUNNABLE狀態而不是RUNNING
  • 程式結束處於TERMINATED狀態
public class NewRunnableTerminated implements Runnable {
    public static void main(String[] args) {
        Thread thread = new Thread(new NewRunnableTerminated());
        // 列印執行緒狀態
        // New
        System.out.println(thread.getState());
        thread.start();
        // Runnable
        System.out.println(thread.getState());
//        try {
//            Thread.sleep(100);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        // Runnable
        System.out.println(thread.getState());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // TERMINATED
        System.out.println(thread.getState());
    }
    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            System.out.println(i);
        }
    }
}
/*
* NEW
RUNNABLE
RUNNABLE
* TERMINATED
* */
  • 演示waiting、Blocked、Timed Waiting
  • 中間頻繁呼叫sleep方法是防止程式碼執行太快,達不到應有的效果
  • 執行緒被呼叫sleep,處於TIMED_WAITING
  • 當一個執行緒執行synchronized內的程式碼,另一個執行緒也要執行則該執行緒處於BLOCKED
  • 執行緒執行wait方法,處於WAITING
public class BlockWaitingTimedWaiting implements Runnable{
    public static void main(String[] args) {
        BlockWaitingTimedWaiting blockWaitingTimedWaiting = new BlockWaitingTimedWaiting();
        Thread thread1 = new Thread(blockWaitingTimedWaiting);
        thread1.start();
        Thread thread2 = new Thread(blockWaitingTimedWaiting);
        thread2.start();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread1.getState());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread2.getState());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread1.getState());
    }
    @Override
    public void run() {
        syn();
    }
    private synchronized void syn() {
        try {
            Thread.sleep(1000);
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
/*
* TIMED_WAITING
BLOCKED
WAITING
* */

阻塞狀態

  • 一般而言,Blocked、Waiting、Timed_waiting都被稱之為阻塞狀態
  • 在阻塞狀態下,什麼時候可以繼續執行是不受控制的

到此這篇關於Java執行緒生命週期圖文詳細講解的文章就介紹到這了,更多相關Java執行緒生命週期內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com