Java併發程式設計

2021-09-20 07:10:25 字數 2803 閱讀 4868

執行緒之間通訊:

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...