執行緒之間通訊:
1.加鎖:object.wait()(釋放鎖)、object.notify()與sychronized()聯合使用,
object lock=new object();
sychronized(lock)
sychronized(lock)
2.改進:無需加鎖並發包下:countdownlatch.await() 和countdownlatch.countdown()
多執行緒設計模式:
future模式:
master-worker模式:常用平行計算模式
系統由兩類程序協作工作,master程序和worker程序,
master負責接收和分配任務,worker負責處理子任務
好處:master將大人物分解成若干小人物交給worker並行執行,提高系統的吞吐量
executor作為靈活且強大的非同步執行框架,其支援多種不同型別的任務執行策略,提供了一種標準的方法將任務的提交過程和執行過程解耦開發,基於生產者-消費者模式,其提交任務的執行緒相當於生產者,執行任務的執行緒相當於消費者,並用runnable來表示任務,executor的實現還提供了對生命週期的支援,以及統計資訊收集,應用程式管理機制和效能監視等機制
多工執行緒框架excutor:工廠模式
內部定義了四中執行緒池:
1.newfixedthreadpool
2.newcachethreadpool
3.newsinglethreadpool
4.newscheduledthreadpool
threadpoolexecutor(int corepoolsize, //核心執行緒數,初始化時池中含有的執行緒數
int maximumpoolsize,//最大執行緒容量
long keepalivetime,//執行緒空閒時銷毀前存活時間
timeunit unit,//時間單位(秒或毫秒等)
blockingqueueworkqueue,// 儲存可排隊等待使用執行緒的任務
threadfactory threadfactory,//
rejectedexecutionhandler handler)//拒絕策略
使用newfixedthreadpool(num)生成固定規格num的執行緒池,底層blockingqueue使用無界佇列linkedblockingqueue,此時corepoolsize和maximumpoolsize設為相同即可
故當排隊等待使用執行緒的任務數量過大時,可能會發生記憶體溢位(雖然linkedblockingqueue稱為無界,但仍受最大值或記憶體限制)
newcachethreadpool()底層blockingqueue使用sychronizedqueue實現,不能存放任何執行緒
newsinglethreadpool()底層blockingqueue和newfixedthreadpool的一樣
newscheduledthreadpool()(可完成定時任務)底層blockingqueue使用delayedqueue()
1.使用有界佇列arrayblockingqueue
若有新的任務需要執行,如果執行緒池實際執行緒數小於corepoolsize,則優先建立執行緒,若大於corepoolsize,
則會將任務加入佇列,若佇列已滿,則在匯流排程數不大於maximumpoolsize的前提下,建立新的執行緒,
並將新的執行緒交給新到來的任務,若執行緒數大於maximumpoolsize,則執行拒絕策略或其他自定義方式
拒絕策略:
abortpolicy:直接跑出異常組織系統正常工作
callerrunspolicy:只要執行緒池未關閉,該策略直接在呼叫者執行緒中,執行當前被丟棄的任務
discardoldestpolicy:丟棄最老的乙個請求,嘗試在此提交當前任務
discardpolicy:丟棄無法處理的任務,不給予任何處理
需要資費你故意拒絕策略需要實現rejectedexrcutorhandler介面
2.使用無界佇列linkedblockingqueue
除非系統資源耗盡,否則無界的任務佇列不存在任務入隊失敗的情況。當有新任務到來,
系統的執行緒數小於corepoolsize時,則建立新執行緒執行任務。當達到corepoolsize時,就不會繼續增加,若後續
仍有新的任務加入,而又沒有空閒的執行緒資源,則任務直接進入佇列等待。若任務建立和處理的速度差異很大,
無界佇列會保持快速增長,知道耗盡系統記憶體。
threadpoolexecutor pool=new threadpoolexecutor(1,2,60,timeunit.seconds,new arrayblockingqueue);
//mytask必須實現runnable介面並重寫run方法
mytask task1=new mytask(1,"任務一");
mytask task2=new mytask(1,"任務二");
pool.execute(task1);
pool.execute(task2);
pool.shutdown();//待任務全部執行完畢後關閉執行緒池
pool.shutdownnow();//立刻關閉,不等全部任務執行完畢
spring家族框架:
springmvc+springbatch+jpa+jdbctemplate+boat+cloud
JAVA併發程式設計
通過常量字串 string 來呼叫 wait 或 notify 方法所導致的問題是,jvm 編譯器會在內部自動將內容相同的 string 轉變為相同的物件。這意味著,即便你建立了兩個不同的 mywaitnotify 例項,他們內部的 mymonitorobject 變數也會指向相同的 string ...
Java併發程式設計 分治程式設計
分治演算法是五大常用演算法之一,本來不應該在這個時間寫這篇部落格,因為之前的執行緒池還沒有寫完,有些知識點也是需要用到的執行緒池的,但是架不住現在的專案裡有個坑隊友,名曰大桌球,他好像是批量註冊使用者還是什麼 暫時就先當做是批量註冊吧 反正就是很多很多使用者,每個使用者大概0.5秒左右的註冊時間,要...
Java併發程式設計教程
1 使用執行緒的經驗 設定名稱 響應中斷 使用threadlocal 2 executor executorservice和future 3 阻塞佇列 put和take offer和poll drainto 4 執行緒間的協調手段 lock condition wait notify notifya...