在沒有看不論什麼**之前首先想一下執行緒池應該有哪幾部分:
任務佇列非常好辦。直接用堵塞佇列就能夠了:blockingqueueworkqueue。而執行緒是用來執行任務的,那麼理所當然應該是不斷地從任務佇列中取出任務來執行,我們來看threadpoolexecutor中的worker的實現:
private final class worker implements runnable catch (runtimeexception ex)
} finally }
// 執行緒啟動之後開始執行
public void run()
} finally
}}
通過推斷runlock是不是鎖上的狀態就能夠推斷worker是否在執行任務了。當然gettask失敗的時候,worker的任務也就結束了,我們有時候會希望執行緒去等一段時間,假設這段時間裡面沒有任務到達執行緒才退出。
這個在堵塞佇列中有執行緒的方法。在gettask能夠看到,例如以下:
r = workqueue.poll(keepalivetime, timeunit.nanoseconds);
在拿到任務的時候,假設如今執行緒池還非常小,那麼如今不須要將任務放到堵塞佇列裡面去,直接建立乙個執行緒執行就能夠了。在這條路走不通的時候才會「繞彎路」來做。由於堵塞佇列也是有容量限制的,那麼在嘗試將任務放進去的時候可能會失敗。
假設讓我寫的話就不會嘗試了,而是直接呼叫堵塞方法讓主線程堵塞在這裡,這樣事實上並不好:
假設自己要實現reject策略的話實現以下介面就能夠了:
public inte***ce rejectedexecutionhandler
有可能出現一種情況:插入任務之後執行緒池的狀態改變了。那麼也要保證該任務可以被處理(並不一定是任務被完畢。也可能是拒絕),那麼以下來看提交任務的完整邏輯:
public void execute(runnable command) else if (!addifundermaximumpoolsize(command))// 假設如今能建立乙個執行緒執行該任務的話,就不要拒絕它了。。
。 reject(command); } }
能夠發如今執行緒池執行期間改動各種閥值都是能夠起到作用的。假設在spring中想用簡單的執行緒池的話沒有必要自己寫乙個,直接用現成的配置乙個就能夠了,比方:
---------- ---------- ---------- ---------- end ---------- ---------- ---------- ----------
Java執行緒池
executors類詳解 此包中所定義的 executor executorservice scheduledexecutorservice threadfactory 和 callable 類的工廠和實用方法。此類支援以下各種方法 建立並返回設定有常用配置字串的 executorservice 的...
Java執行緒池
一 執行緒池 單執行緒 public static void runsinglethreadpool public static void runsinglethreadpoolwithfactory private static class mythreadfactory implements t...
java 執行緒池
1.執行緒池的作用 限制系統中執行執行緒的數量 2.為什麼要用執行緒池 2.1.減少了建立和銷毀執行緒的次數,每個工作執行緒都可以被重複利用,可執行多個任務.2.2 可以根據系統的承受能力,調整執行緒池中工作線執行緒的數目,防止因為消耗過多的記憶體,而把伺服器累趴下。3.執行緒池介面類 3.1 ex...