百度百科:java
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。spa
好比打開抖音 抖音就是一個進程操作系統
百度百科:線程
是操做系統可以進行運算調度的最小單位。它被包含在進程中,是進程實際運做單位。一個進程由多個線程組成。設計
進程 騰訊視屏.exe 點擊 啓動 code
好比抖音給美女點贊,進程須要開一個線程去給點贊數+1 協程
知識點:線程切換須要消耗系統資源 有興趣能夠了解一下協程/纖程 更小更快對象
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狀態 他沒有要是進不來
//線程狀態枚舉 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(); }
有問題能夠留言哦,或者公衆號留言(回覆快):