Java多線程:4.線程的生命週期-6個狀態

一、線程的6個狀態

  • New(新創建)
    使用new Thread()新創建但還沒啓動的線程。
  • Runnable(可運行和運行中)
    調用start()方法後線程即處於Runnable()狀態,無論線程是夠真正獲取到了資源真正的運行。
    即使調用了start()方法後因爲系統沒有資源,線程狀態依然是runnable。
  • Blocked(被阻塞)
    當線程運行到synchronized代碼塊時,並且該鎖被其他線程拿走了,這個線程的狀態就是blocked。
  • Waiting(等待)
    調用了Object.wait()、Thread.join()、LockSupport.park()方法後,線程進入wait狀態,可提前喚醒。
  • Timed Waiting(計時等待)
    調用了Thread.sleep(time)、Object.wait(time)、Thread.join(time)、LockSupport.parkNanos(time)、LockSupport.parkUntil(time)方法後,線程進入timed waiting狀態。
    可以看做有等待時間期限的wait狀態,可提前喚醒。
  • Terminated(終止)
    run()方法執行結束了,或者拋出異常導致run()方法終止,線程進入terminated狀態。
    在這裏插入圖片描述

二、線程的狀態演示

1.New、Runnable、Terminated
/**
 * 展示線程的New、Runnable、Terminated狀態
 */
public class ThreadStatus {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new DoWork());
        System.out.println("執行new Thread()後子線程的狀態:"+thread.getState());

        thread.start();
        System.out.println("執行Thread.start()後子線程的狀態:"+thread.getState());

        Thread.sleep(1);
        System.out.println("執行run()時子線程的狀態:"+thread.getState());

        Thread.sleep(100);
        System.out.println("執行完run()時子線程的狀態:"+thread.getState());
    }
}

class DoWork implements Runnable{
    @Override
    public void run() {
        for (int i=0; i<10000; i++){
            if(i%100==0){
                System.out.println(i);
            }
        }
    }
}

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

2.Blocked、TimedWaiting
/**
 * 展示線程的Blocked、TimedWaiting狀態
 */
public class ThreadStatus {
    public static void main(String[] args) throws InterruptedException {
        DoWork doWork = new DoWork();
        Thread thread1 = new Thread(doWork);
        Thread thread2 = new Thread(doWork);
        thread1.start();
        thread2.start();

        Thread.sleep(1000);

        System.out.println("thread1進入syn(),等待3s,狀態:"+thread1.getState());
        System.out.println("thread2沒有syn()的鎖,阻塞,狀態:"+thread2.getState());
    }
}

class DoWork implements Runnable{
    @Override
    public void run() {
        syn();
    }

    // 只能有一個線程進入,其餘想進入的線程阻塞
    private synchronized void syn(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在這裏插入圖片描述

3.Waiting
/**
 * 展示線程的Waiting狀態
 */
public class ThreadStatus {
    public static void main(String[] args) throws InterruptedException {
        DoWork doWork = new DoWork();
        Thread thread1 = new Thread(doWork);
        thread1.start();

        Thread.sleep(3100);
        System.out.println("thread1執行了wait(),狀態:"+thread1.getState());
    }
}

class DoWork implements Runnable{
    @Override
    public void run() {
        syn();
    }

    // 只能有一個線程進入,其餘想進入的線程阻塞
    private synchronized void syn(){
        try {
            Thread.sleep(3000);
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在這裏插入圖片描述


三、阻塞狀態

一般情況下,把Blocked(阻塞)、Waiting(等待)、TimedWaiting(計時等待)都稱爲阻塞狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章