併發多執行緒部分問題解析

2021-08-28 13:42:12 字數 1653 閱讀 6292

好吧我只是試試水,這篇基本上就是從併發程式設計的藝術這本書摘錄出來的(之後的文章會貼出原始碼分析,以及更多的理解,歡迎來錘!!!)

先說一下執行緒池的組成部分--

乙個執行緒池包括以下四個基本組成部分:

1、執行緒池管理器(threadpool):用於建立並管理執行緒池,包括 建立執行緒池,銷毀執行緒池,新增新任務;

2、工作執行緒(poolworker):執行緒池中線程,在沒有任務時處於等待狀態,可以迴圈的執行任務;

3、任務介面(task):每個任務必須實現的介面,以供工作執行緒排程任務的執行,它主要規定了任務的入口,任務執 行完後的收尾工作,任務的執行狀態等;

4、任務佇列(taskqueue):用於存放沒有處理的任務。提供一種緩衝機制。

1)執行緒池判斷核心執行緒池裡的執行緒是否都在執行任務。如果不是,則建立乙個新的工作執行緒來執行任務。如果核心執行緒池裡的執行緒都在執行任務,則進入下個流程。

2)執行緒池判斷工作佇列是否已經滿。如果工作佇列沒有滿,則將新提交的任務儲存在這個工作佇列裡。如果工作佇列滿了,則進入下個流程。

3)執行緒池判斷執行緒池的執行緒是否都處於工作狀態。如果沒有,則建立乙個新的工作執行緒 來執行任務。如果已經滿了,則交給飽和策略來處理這個任務。

1.減少建立和銷毀執行緒的次數,每個工作執行緒都可以被重複利用,可執行多個任務。

2.(靈活)可以根據系統的承受能力,調整執行緒池中工作線執行緒的數目,防止因為消耗過多的記憶體,而把伺服器累趴   下(每個執行緒需要大約1mb記憶體,執行緒開的越多,消耗的記憶體也就越大,最後宕機)。

new  threadpoolexecutor(corepoolsize, maximumpoolsize, keepalivetime, milliseconds,runnabletaskqueue, handler);

(好吧,其實有四種方式建立,根據自己業務需求建立)

1.newsinglethreadexecutor

建立乙個單執行緒的執行緒池。這個執行緒池只有乙個執行緒在工作,也就是相當於單執行緒序列執行所有任務。如果這個唯一的執行緒因為異常結束,那麼會有乙個新的執行緒來替代它。此執行緒池保證所有任務的執行順序按照任務的提交順序執行。

2.newfixedthreadpool

建立固定大小的執行緒池。每次提交乙個任務就建立乙個執行緒,直到執行緒達到執行緒池的最大大小。執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充乙個新執行緒。

3.newcachedthreadpool

建立乙個可快取的執行緒池。如果執行緒池的大小超過了處理任務所需要的執行緒,那麼就會**部分空閒(60秒不執行任務)的執行緒,當任務數增加時,此執行緒池又可以智慧型的新增新執行緒來處理任務。此執行緒池不會對執行緒池大小做限制,執行緒池大小完全依賴於作業系統(或者說jvm)能夠建立的最大執行緒大小。

4.newscheduledthreadpool

建立乙個大小無限的執行緒池。此執行緒池支援定時以及週期性執行任務的需求

多執行緒 HashMap 死迴圈 問題解析

原始碼resize void resize int newcapacity 複製 遷移 void transfer entry newtable while e null 複製 我們可以知道newtable 是新建立的 是執行緒私有的,因為 執行緒1 獲取 e 和next 之後 執行緒2 插入執行了...

多執行緒併發問題

執行緒安全是乙個非常燙手的山芋,因為即使合理運用了鎖,也不一定能保證執行緒安全,這是因為落後的編譯器無法滿足日益增長的併發需求,很多看似無錯的 在優化和併發面前產生了麻煩,可以看下面的 x 0 thread1 thread2 lock lock x x unlock unlock 上面的 看著是沒有...

多執行緒併發

多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...