話說 線程的概念&生命週期

1、線程的概念&生命週期

1. 什麼是進程

百度百科:java

進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。spa

好比打開抖音 抖音就是一個進程操作系統

2. 什麼是線程

百度百科:線程

是操做系統可以進行運算調度的最小單位。它被包含在進程中,是進程實際運做單位。一個進程由多個線程組成。設計

進程 騰訊視屏.exe 點擊 啓動 code

好比抖音給美女點贊,進程須要開一個線程去給點贊數+1 協程

知識點:線程切換須要消耗系統資源 有興趣能夠了解一下協程/纖程 更小更快對象

3. 線程的生命週期

1. new: 剛建立線程 還沒開始執行 生命週期

2. Runnable: 調用start()方法以後 就會交給線程調度器執行了,歸操做系統管了 這時候是Runnable隊列

​ Runnable 能夠分爲兩個狀態:

2.1 Ready: 就緒狀態 這個時候線程進了CPU的等待隊列 等着CPU執行了

​ 或者cpu執行了一半,又去執行別的線程了,當前線程被掛起

​ 或者執行Thread.yield() 方法 主動讓出cpu

2.2 Running: 運行狀態 獲取到了CPU的執行權限 開始執行

3. Blocked: 線程進入synchronized同步代碼塊中 而後沒有獲取到所資源的時候 就阻塞

4. Waiting: 調用wait join LockSuport.park() 等方法後 進入Waiting狀態
​ 須要notify、notifyAll、LockSuport.unpark() 才能逃離waiting狀態

5. TimeWaiting: 與Waiting相似 只是加了時間 超過必定時間 自動逃離Waiting狀態

6. Terminated: 線程結束 線程內容執行完告終束 Terminated狀態以後不能再進入其餘狀態了

image

這個狀態看一次會了,過段時間就忘了 因此呢想個辦法 讓它留在腦海

假如你(CPU)找了個對象(Thread)

你對象可能的狀態有:

剛找到對象:New

對象洗白白鑽被窩:Ready

你有空了被窩找對象:Running

對象要睡覺:TimeWaiting

你要洗澡,對象要去廁所 須要在門口waitting

你生氣了把對象鎖門外:對象處於Blocked狀態 他沒有要是進不來
image

4. 瞅一眼代碼
//線程狀態枚舉 
public enum State {
        NEW,
        RUNNABLE, // 多是Ready 多是 Running 看cpu調度了
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
}

NEW:

Thread t1 = new Thread(()->{
            System.out.println("線程1");
 });

System.out.println("t1狀態:"+t1.getState().name()); // NEW

RUNNABLE:

final Thread t1 = new Thread(()->{
    try {
        while (true){
            Thread.yield();
        }
    } catch (Exception e){}
});

t1.start();

new Thread(()->{
    System.out.println("t1狀態:"+t1.getState().name());
}).start();

Waiting:

public static Object o = new Object();
public static void main(String[] args) throws InterruptedException {
    final Thread t1 = new Thread(()->{
        try {
            synchronized (o){
                o.wait();
            }
        } catch (Exception e){}
    });

    t1.start();

    Thread.sleep(1000);

    new Thread(()->{
        System.out.println("t1狀態:"+t1.getState().name());
    }).start(); // WAITING

}

TIMED_WAITING:

public static Object o = new Object();
public static void main(String[] args) throws InterruptedException {
    final Thread t1 = new Thread(()->{
        try {
            synchronized (o){
                o.wait(10000);
            }
        } catch (Exception e){}
    });

    t1.start();

    Thread.sleep(1000);

    new Thread(()->{
        System.out.println("t1狀態:"+t1.getState().name());
    }).start();
}

Blocked:

public static Object o = new Object();
public static void main(String[] args) throws InterruptedException {
    final Thread t1 = new Thread(()->{
        try {
            Thread.sleep(1000);
            synchronized (o){

            }
        } catch (Exception e){}
    });

    t1.start();



    new Thread(()->{
        synchronized (o){
            try {
                Thread.sleep(2000);
                System.out.println("t1狀態:"+t1.getState().name());//Blocked
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }).start();
}

有問題能夠留言哦,或者公衆號留言(回覆快):
image

相關文章
相關標籤/搜索