玩轉java多執行緒 之多執行緒基礎 執行緒狀態 及執行緒停止實戰

太陽石笑笑發表於2020-10-03

從網上先找了下,覺得這兩張圖比較好
在這裡插入圖片描述
在這裡插入圖片描述
比較清楚的看到執行緒的5大狀態
新生狀態:

Thread t = new Thread()

執行緒物件一旦建立,就進入到新生狀態

就緒狀態
當呼叫start()方法,執行緒立即進入就緒狀態的,但是並不意味著立即排程執行

阻塞狀態:
當呼叫sleep,wait或者是同步鎖定時,執行緒進入阻塞狀態,程式碼不往下繼續執行,阻塞事件解除後,重新進入就緒狀態,等待cpu的排程執行

執行狀態:
進入執行狀態,執行緒真正執行執行緒體的程式碼塊

dead狀態:
執行緒中斷或者結束,一旦進入死亡狀態,就不能再次啟動

執行緒方法:

//更改執行緒的優先順序
setPriority(int new Priority)
//在指定的毫秒數讓正在執行的執行緒休眠
static void sleep(long millis)
//等待該執行緒終止
void join()
//暫停當前正在執行的執行緒物件,並執行其他執行緒
static void yield()
//中斷執行緒,別用這個方式
void interrupt()
//測試執行緒是否處於活動狀態
boolean isAlive()

停止執行緒,不推薦使用jdk提供的stop(),destroy()方法,這兩個方法已經廢棄
在這裡插入圖片描述

推薦執行緒自己停止下來
建議使用一個標誌位進行終止變數,當flag=false,終止執行緒執行

好了,看下程式碼

package duoxiancheng;

//測試執行緒停止
public class TestStop implements Runnable{
    //設定一個標誌位
    private boolean flag = true;

    @Override
    public void run() {
        int i = 0;
        while(flag) {
            System.out.println("run ... Thread" + i++);
        }
    }

    //設定一個公開的方法停止執行緒,轉換標誌位
    public void stop() {
        this.flag = false;
    }

    public static void main(String[] args) {
       TestStop testStop = new TestStop();
       new Thread(testStop).start();

        for (int i = 0; i < 1000; i++) {
            System.out.println("main" + i);
            if(i == 900) {
                //呼叫stop方法切換標誌位,停止執行緒
                testStop.stop();
                System.out.println("執行緒該停止了");
            }
        }
    }
}

在這裡插入圖片描述
這個我都是在b站跟著狂神視訊做的筆記,
大家有興趣可以看下,講的很贊
好了,今天就先到這裡了~

相關文章