多線程
程式:程式是指令和資料的有序集合,是一個靜态的概念
程序:執行程式的一次執行過程,是一個動态的概念,程序是資源配置設定的機關
線程:一個程序中有若幹個線程,線程是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: