需求背景:由于頻繁的自行創建和銷毀執行緒非常的消耗資 源,并且難以控制執行緒的并發數量,所以專案組急需撰寫 一個執行緒池功能,能夠自行管理執行緒的生命周期,并且根 據繁忙執行緒池程度對池中執行緒進行動態擴容。
現在專案經理抽象出執行緒池物件中包含有幾個主要特性 1. 可以根據任務數量進行執行緒數量擴容,在空閑時執行緒 池中只保存coreSize數量的執行緒,而當coreSize個執行緒已 經全部在作業時,這個時候如果再添加任務進來,會新建 執行緒,接受任務,直到池中的執行緒數量達到maxSize時, 不在新建執行緒 2. 當執行緒數量達到maxSize時,并且所有執行緒都處于工 作狀態,這時如果還有任務添加過來,則將其保存在一個 佇列中(可以自定義佇列,也可以自行調研并使用jdk中已 有的Queue子類) 3. 如果佇列中的任務數量已經達到了最大值(佇列滿 了),這個時候又有任務添加過來,則執行丟棄策略(可 以什么都不做,也可以仍出例外,也可以讓主執行緒中直接 呼叫run處理掉等等,最好使用策略模式而不是if-else) 4. 定義執行緒的空閑時間,如果執行緒池處理完了任務,線 程空閑了,則根據已定義新增執行緒的空閑時間,如果時間
達到了,則回收執行緒直到執行緒數量達到coreSize數量為 止。(注意回收等操作的原子性,防止資料不一致)
思路,允許先在一個類中完成所有功能,再對代碼進行面 向物件重構 也可以直接研讀jdk執行緒池原始碼,參照寫一份也可以(不建 議) 撰寫測驗類,測驗你的執行緒池是否功能正常
uj5u.com熱心網友回復:
自己手寫太費時了吧,ExecutorService threadPool = Executors.newCachedThreadPool()可以了解下。和你的需求有些類似uj5u.com熱心網友回復:
你可以看看jdk原始碼,然后在這樣那樣就行uj5u.com熱心網友回復:
建議你查看一下當前主流技術的原始碼, 先這樣,然后這樣,然后再這樣就行了。uj5u.com熱心網友回復:
我理解了,我試了一下那樣子,然后這樣子敲了一下,最后那樣子成功了
uj5u.com熱心網友回復:
這回答666
uj5u.com熱心網友回復:
, 執行緒池 原本的設計是 任務數量超過 coreSize,放佇列, 任務佇列放滿之后 ,再有任務開始新建執行緒執行, 除非執行緒數目已經達到 maxSize .之后就執行 拒絕策略.
我倆到底誰錯了. 還是你們經理的設計 就喜歡 違反 原本的設計來.
uj5u.com熱心網友回復:
, 執行緒池 原本的設計是 任務數量超過 coreSize,放佇列, 任務佇列放滿之后 ,再有任務開始新建執行緒執行, 除非執行緒數目已經達到 maxSize .
之后就執行 拒絕策略.
我倆到底誰錯了. 還是你們經理的設計 就喜歡 違反 原本的設計來.
你的理解沒啥問題,JDK的執行緒池java.util.concurrent.ThreadPoolExecutor的邏輯確實是如你所說的那樣核心執行緒---佇列---最大執行緒---拒絕策略.不過他們經理的設計思想與tomcat的執行緒池一致,tomcat的執行緒池的邏輯是核心執行緒---最大執行緒---佇列----拒絕策略.關鍵原始碼可以看下org.apache.tomcat.util.threads.TaskQueue的offer()方法,如下,這里不展開討論java.util.concurrent.ThreadPoolExecutor的execute()方法,感興趣的同學自己去看下.
@Override
public boolean offer(Runnable o) {
//we can't do any checks
if (parent==null) return super.offer(o);
//we are maxed out on threads, simply queue the object
if (parent.getPoolSize() == parent.getMaximumPoolSize()) return super.offer(o);
//we have idle threads, just add it to the queue
if (parent.getSubmittedCount()<=(parent.getPoolSize())) return super.offer(o);
//if we have less threads than maximum force creation of a new thread
if (parent.getPoolSize()<parent.getMaximumPoolSize()) return false;
//if we reached here, we need to add it to the queue
return super.offer(o);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/135824.html
標籤:Java SE
