天天看點

多線程

多線程

多線程

程式:程式是指令和資料的有序集合,是一個靜态的概念

程序:執行程式的一次執行過程,是一個動态的概念,程序是資源配置設定的機關

線程:一個程序中有若幹個線程,線程是cpu排程和執行的機關

如:視訊中同時可以聽聲音、看圖像、看彈幕

資料紊亂

結果

使代碼變得更簡潔

去掉一些沒有用的代碼,隻留下核心代碼

避免内部類定義過多

函數式接口:一個接口隻有一個方法

函數式接口可以使用lambda表達式

五個狀态

建立狀态: new thread()線程對象一旦建立就進入到新生狀态

就緒狀态:start() 調用方法後進入,但不意味着立即執行 ,等待cpu的排程執行

阻塞狀态:調用sleep,wait或同步鎖定

運作狀态:進入運作狀态,線程才真正執行線程體的代碼塊

死亡狀态:線程中斷或者結束,一旦進入死亡,就不能再次啟動

模拟網絡延時:放大問題的發生性

模拟倒計時

讓cpu重新排程,不一定成功,看cpu

合并線程,待此線程完成後,在執行其他線程,其他線程阻塞

少使用,會阻塞

優先級越高,cpu調用的機會越大

daemon

線程分為使用者線程和守護線程

虛拟機必須等使用者線程執行完畢

虛拟機不用等守護線程執行完畢,隻關注使用者線程結束後,結束程式

**并發 **

同一個對象被多個線程同時操作

隊列和鎖

形成線程同步的條件:隊列+鎖。

每個對象對應一把鎖

線程同步是為了安全

同步方法

synchronized方法和synchronized塊

控制對象的通路,每個對象一把鎖,方法一旦執行,就獨占該鎖,知道方法傳回釋放鎖

缺陷:會影響效率

鎖的對象為變化的量,增删改

某一個同步塊同時擁有“兩個以上對象的鎖”,可能産生死鎖的問題。

産生死鎖的四個必要條件

互斥條件:一個資源隻能被一個程序使用

請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放

不剝奪條件:程序已獲得資源,在未使用完前,不能強行剝奪

循環等待條件:若幹程序之間形成一種頭尾相接的循環等待資源的關系

顯式定義同步鎖(手動開啟和關閉,别忘記關鎖),隻有代碼塊鎖

synchronized是隐式鎖,出了作用域後自動釋放,有代碼塊和方法鎖

reentrantlock類實作了lock

生産者消費者模式

生産者和消費者共享同一個資源,并且生産者和消費者之間互相依賴,互為條件

生産者:沒有生産産品之前,需要通知消費者等待,生産産品後,需要通知消費者消費

消費者:消費後,通知生産者生産新的産品以供消費

synchronized可阻止并發更新同一個共享資源,實作了同步,但不能實作不同線程之間的消息傳遞

wait()

線程一直等待,直到其他線程通知,會釋放鎖

wait(long timeout)

notify()

喚醒一個處于等待的線程

notifyall()

喚醒同一個對象所有wait的線程,優先級高的線程優先排程

使用線程池,對性能好

提高響應速度

降低資源消耗

便于線程管理

executorservice和executors: