執行緒池及併發程式設計基礎總結

2022-03-23 06:17:25 字數 1779 閱讀 8120

executorservice threadpool = executors.newfixedthreadpool(3);// 建立可以容納3個執行緒的執行緒池
executorservice threadpool = executors.newcachedthreadpool();// 執行緒池的大小會根據執行的任務數動態分配
executorservice threadpool = executors.newsinglethreadexecutor();// 建立單個執行緒的執行緒池,如果當前執行緒在執行任務時突然中斷,則會建立乙個新的執行緒替代它繼續執行任務
scheduledexecutorservice threadpool = executors.newscheduledthreadpool(3);// 效果類似於timer定時器
reentrantlock(可重入的鎖)

解決方式:reentrantlock可以使用trylock(timeout, unit)方法去控制等待獲得鎖的時間,也可以使用無引數的trylock方法立即返回,這就避免了死鎖出現的可能性。

解決方式:reentrantlock可以使用構造方法reentrantlock(fair)來強制使用公平模式,這樣就可以保證執行緒獲得鎖的順序是按照等待的順序進行的,而synchronized進行同步的時候,是預設非公平模式的,但jvm可以很好的保證執行緒不被餓死。

reentrantlock有這樣一些優點,當然也有不足的地方。最主要不足的一點,就是reentrantlock需要開發人員手動釋放鎖,並且必須在finally塊中釋放。

在object中,有乙個wait的本地方法;它可以用來協調執行緒之間的協作。

wait一般情況下最常用的場景是構造乙個花銷非常大的物件的時候,比如jdk動態**在生成**類的時候就使用了這種方式。jdk6在生成乙個**類之前,會先檢測乙個是否正在生成中的標識,如果正在生成的話,jdk6就會在物件上等待,直到正在生成的**類生成完畢,然後直接從快取中獲取。

wait,notify和notifyall方法在使用前,必須獲取到當前物件的鎖,否則會告訴你非法的監控狀態異常。還有一點,則是如果有多個執行緒在wait等待,那麼呼叫notify會隨機通知其中乙個執行緒,而不會按照順序通知。換句話說,notify的通知機制是非公平的,notify並不保證先呼叫wait方法的執行緒優先被喚醒。notifyall方法則不存在這個問題,它將通知所有處於wait等待的執行緒。

jdk的類庫中,有這樣的乙個類condition,來彌補wait方法本身的不足。

解決方式:condition可以使用返回值標識是否達到了超時時間。

解決方式:condition之需要獲得lock的鎖即可,乙個lock可以擁有多個條件。

這個類是為了幫助猿友們方便的實現乙個這樣的場景,就是某乙個執行緒需要等待其它若干個執行緒完成某件事以後才能繼續進行。

這個類是為了幫助猿友們方便的實現多個執行緒一起啟動的場景,就像賽跑一樣,只要大家都準備好了,那就開始一起衝。比如下面這個程式,所有的執行緒都準備好了,才會一起開始執行。

這個類是為了幫助猿友們方便的實現控制數量的場景,可以是執行緒數量或者任務數量等等。

這個類是為了幫助猿友們方便的實現兩個執行緒交換資料的場景,使用起來非常簡單。

java併發程式設計 執行緒池

降低資源消耗 提高響應速度 t1 執行緒建立的時間 t2 工作任務執行額時間 t3 執行緒銷毀時間 提高了執行緒的可管理性 corepoolsize 核心執行緒數 如果執行的執行緒數大於核心執行緒數,則會先進入到阻塞佇列裡 maxinumpoolsize 允許最大執行緒數 執行緒池所建立的執行緒數一...

併發程式設計之 執行緒池

執行緒池做的工作主要是控制執行的執行緒的數量,處理過程中將任務放入佇列,然後再執行緒建立後啟動這些任務,如果執行緒數量超過了最大數量,超出數量的執行緒排隊等候,等其它執行緒執行完畢,再從佇列中取出任務來執行。他的主要特點為 執行緒復用 控制最大併發數,管理執行緒。第一 降低資源消耗。通過重複利用已建...

併發程式設計之執行緒池

步驟1 自定義拒絕策略介面 1 執行緒池狀態 threadpoolexecutor使用int的高3位來表示執行緒池狀態,低29位表示執行緒數量 從數字上比較,terminated tidying stop shutdown running 這些資訊儲存在乙個原子變數ctl中目的是將執行緒池狀態與執行...