【環球播資訊】狂神說 多線程

2022-12-12 17:11:37 來源:51CTO博客

多線程

start() 和 run() 的區別?

線程不一定執行 由cpu調度安排


(相關資料圖)

繼承Thread類
子類繼承Thread類具備多線程能力啟動線程:子類對像.start()不建議使用:避免oop單繼承局限性
new THread(new MyThread()).start();
實現Runnable接口
具有多線程能力啟動線程: 傳入目標對象+Thread對象.start()推薦使用:避免單繼承局限性,方便同一個對象被多個線程使用· ·3AQ`
實現Callable接口
1.實現Callable接口,需要返回值類型2.重寫call方法,需要拋出異常3.創建目標對象4.創建執行服務: ExecutorService ser = Executors.newFixedThreadPool(1);5.提交執行: Future result1 = ser. submit(t1);6.獲取結果: boolean r1 = result1.get()7.關閉服務: ser.shutdownNow();
靜態代理
lambda表達式
避免匿名內部類定義過多看起來更簡潔去掉了一些無意義的代碼
函數式接口(Functional interface)的定義:
任何接口,入伙只包含唯一一個抽象的方法,那么就是一個函數式接口
public interface Runnable(){  punlic abstract void run();}
對于函數式接口,我們可以通過lambda表達式來創建接口的對象
new Thread(()->sout("hhhhhhh")).start();
線程狀態
線程方法
線程休眠sleep Thread.sleep

100ms==1s

sleep (時間)指定當前線程阻塞的毫秒數;sleep存在異常 InterruptedException;sleep時間達到后線程進入就緒狀態;sleep可以模擬網絡延時,倒計時等每一個對象都有一個鎖,sleep不會釋放鎖;
線程禮讓yield Thread.yield()

讓當前正在執行的線程暫停,但不阻塞

讓線程從運行狀態轉為就緒狀態

讓cpu重新調度,禮讓不一定成功! 看cpu心情

join

join合并線程,代詞線程執行完成后 在執行其他線程,其他線程阻塞

可以想象成插隊

觀測線程狀態
NEWRUNNABLETIME_WAITTINGTERMINATED
線程優先級

用數字表示 范圍從1~10.

Thread.MIN_PRIORITY=1;Thread.MAX_PRIORITY=10;Thread.NORM_PRIORITY=5;//改變或者獲取優先級getPriority().setPriority(int xxx)
守護(daemon)線程

線程分為:用戶線程 和 守護線程

虛擬機必須確保用戶線程執行完畢

虛擬機不用等待守護線程執行完畢

線程同步機制

線程同步其實就是一個等待機制

默認的ArryList 線程不安全CopyOnWriteArryLIst  線程安全
隊列和鎖

鎖機制

synchronized 默認鎖的是run

synchronized(鎖的對象){  //代碼塊}//鎖的對象:需要增刪改的對象
死鎖

都在等待對方的資源

解決方法:不要抱對方的鎖 ,從代碼塊中拿出來

產生死鎖的四個必要條件:

1.互斥條件:一個資源每次只能被一一個進程使用。2.請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。3.不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。4.循環等待條件:若干進程之間形成- -種頭尾相接的循環等待資源關系。

Lock(鎖)
class A{    private finall ReenTrantLock lock = new ReenTrantLock();    public void m(){        lock.lock();        try{            //保證線程安全的代碼                    }finally{            lock.unlock();            //如果同步代碼有異常,要將unlock()寫入finally語句塊        }    }}

◆從JDK 5.0開始,Java提供了更強大的線程同步機制一通過 顯式定義同步鎖對象來實現同步。同步鎖使用Lock對象充當◆java.util.concurrent.locks.Lock接口是控制多個線程對共享 資源進行訪問的工具。鎖提供了對共享資源的獨占訪問,每次只能有一-個線程對Lock對象加鎖,線程開始訪問共享資源之前應先獲得L ock對象◆ReentrantLock(可重入鎖)類實現了Lock,它擁有與synchronized相同的并發性和內存語義,在實現線程安全的控制中,比較常用的是ReentrantLock,可以顯式加鎖、釋放鎖。

synchronized與Lock的對比

◆Lock是顯式鎖(手動開啟和關閉鎖,別忘記關閉鎖) synchronized是隱式鎖,出了作用域自動釋放◆Lock只有代碼塊鎖,synchronized有 代碼塊鎖和方法鎖◆使用Lock鎖,JVM將花費較少的時間來調度線程,性能更好。并且具有更好的擴展性(提供更多的子類)◆優先使用順序:◆Lock >同步代碼塊(已經進入了方法體,分配了相應資源) >同步方法(在方法體之外)

04線程協作

生產者消費者模式 問題

線程通信

應用場景:生產者和消費者問題◆假設倉庫中只能存放一件產品,生產者將生產出來的產品放入倉庫,消費者將倉庫中產品取走消費◆如果倉庫中沒有產品,則生產者將產品放入倉庫,否則停止生產并等待,直到倉庫中的產品被消費者取走為止.◆如果倉庫中放有產品,則消費者可以將產品取走消費,否則停止消費并等待,直到倉庫中再次放入產品為止.

管程法
信號燈法
線程池

標簽: 執行完畢 啟動線程

上一篇:全球今亮點!優維低代碼:Theme & Mode 頁面主題和模式
下一篇:新消息丨嵌入式:ARM的流水線技術