天天看點

線程的概念&生命周期

一、線程的概念&生命周期

1. 什麼是程序

百度百科:

程序(Process)是計算機中的程式關于某資料集合上的一次運作活動,是系統進行資源配置設定和排程的基本機關,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在當代面向線程設計的計算機結構中,程序是線程的容器。程式是指令、資料及其組織形式的描述,程序是程式的實體。

比如打開抖音 抖音就是一個程序

2. 什麼是線程

是作業系統能夠進行運算排程的最小機關。它被包含在程序中,是程序實際運作機關。一個程序由多個線程組成。

程序 騰訊視屏.exe 點選 啟動

比如抖音給美女點贊,程序需要開一個線程去給點贊數+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狀态之後不能再進入其他狀态了

線程的概念&生命周期

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

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

你對象可能的狀态有:

剛找到對象:New

對象洗白白鑽被窩:Ready

你有空了被窩找對象:Running

對象要睡覺:TimeWaiting

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

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

線程的概念&生命周期
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();}      
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();}      

繼續閱讀