XGP 8月新增遊戲公開 《人類》《極品飛車21》等
阿新 • • 發佈:2021-08-18
執行緒簡介
程序與執行緒的區別:
- 說起程序就不得不說下程式,程式是指令和資料的有序集合,其本身沒有任何執行的含義,是一個靜態的概念。
- 而程序則是執行程式的一次執行過程,它是一個動態概念,是系統資源分配的單位。
- 通常在一個程序中可以包含若干個執行緒,當然一個程序中至少包含一個執行緒,不然沒有存在的意義,執行緒是cpu排程和執行的單位。
- 注意:很多執行緒是模擬出來的,真正的多執行緒是指有多個cpu,即多核,如伺服器。如果是模擬出來的多執行緒,即在一個cpu的情況下,在同一時間點,cpu只能執行一個程式碼,因為切換的很快就有了同時執行的錯覺。
執行緒實現(重點)
Thread
- 自定義執行緒類繼承Thread類
- 重寫run()方法,編寫執行緒執行體
- 建立執行緒物件,呼叫start()方法啟動執行緒
package com.kuang.thread; //建立執行緒方式1:繼承Thread類,重寫run()方法,呼叫start啟動執行緒 //總結:執行緒開啟不一定執行,由cpu排程 public class TestThread01 extends Thread { @Override public void run() { //run()方法執行緒體 for (int i = 0; i < 20; i++) { System.out.println("run方法"+i); } } public static void main(String[] args) { //main執行緒,主執行緒 //建立一個執行緒物件 TestThread01 testThread01 = new TestThread01(); //呼叫start方法開啟執行緒 testThread01.start(); for (int i = 0; i < 20; i++) { System.out.println("main方法"+i); } } }
實現Runnable
- 定義MyRunnable類實現Runnable介面
- 實現run()方法,編寫執行緒執行體
- 建立執行緒物件,呼叫start()方法啟動執行緒
-
package com.kuang.thread; //建立執行緒方式2:實現Runnable介面,重寫run方法,執行執行緒需要丟入Runnable介面的實現類,呼叫start public class TestThread02 implements Runnable{ @Override public void run() { //run()方法執行緒體 for (int i = 0; i < 20; i++) { System.out.println("run方法"+i); } } public static void main(String[] args) { //建立Runnable介面實現類的物件 TestThread02 testThread02 = new TestThread02(); //建立執行緒物件 通過執行緒物件來開啟執行緒,代理 Thread thread = new Thread(testThread02); thread.start(); //建立一個執行緒物件 TestThread01 testThread01 = new TestThread01(); //呼叫start方法開啟執行緒 testThread01.start(); for (int i = 0; i < 20; i++) { System.out.println("main方法"+i); } } }
執行緒狀態
執行緒同步(重點)
併發:同一個物件被多個執行緒同時操作
-
現實生活中,我們會遇到“同一個資源,多個人都想使用”的問題,比如,食堂排隊打飯,每個人都想打飯,比較好的解決辦法,就是排隊,按照順序來
-
處理多執行緒問題時,多個執行緒訪問同一個物件(併發),並且某些執行緒還想修改這個物件,這個時候我們就需要執行緒同步,執行緒同步其實就是一種等待機制,多個需要同時訪問此物件的執行緒進入這個物件的等待池形成佇列,等待前面的執行緒使用完畢,下一個執行緒在使用。
-
由於同一程序的多個執行緒共享同一塊儲存空間,在帶來方便的同時,也帶來了訪問衝突的問題,為了保證資料在方法中被訪問時的正確性,在訪問時加入鎖機制synchronized,當一個執行緒獲得物件的排它鎖,獨佔資源,其他執行緒必須等待,使用後釋放鎖即可。存在以下問題:
-
一個執行緒持有鎖會導致其他需要此鎖的執行緒掛起
-
在多執行緒的競爭下,加鎖,釋放鎖會導致較多的上下文切換和排程延時,引起效能問題
-
如果一個優先順序高的執行緒等待一個優先順序低的執行緒釋放鎖,會導致優先順序倒置,引起效能問題