技術複習-java執行緒池
阿新 • • 發佈:2019-05-05
ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
引數詳解
-
corePoolSize 核心執行緒數 當執行緒數<corePoolSize時,新建執行緒。
-
maxinumPoolSize 最大執行緒數
-
keepAliveTime 存活時間 當執行緒數>corePoolSize時,空閒執行緒存活的最長時間
-
timeUnit 單位時間
-
workQueue 儲存任務的阻塞佇列
-
threadFactory 執行緒建立工廠
-
handler 拒絕策略
任務執行順序
- 當執行緒數<corePoolSize時,新建執行緒執行任務。
- 當執行緒數>corePoolSize,且workQueue未滿的時候,任務加到workQueue中。
- 當執行緒數>corePoolSize,且workQueue滿了,且當前執行緒數<maximumPoolSize,則新起執行緒執行。
- 當執行緒數>corePoolSize,且workQueue滿了,且當前執行緒數>=maximumPoolSize,則執行拒絕策略
4個預設拒絕策略
拒絕策略預設有4種 1.丟擲異常 2.直接丟棄 3.丟棄佇列中最老的 4.直接呼叫run方法,阻塞執行。 當然也可以繼承RejectedExecutionHandler實現自己的拒絕策略
Executors
因為引數比較多,java中的Exectors提供了簡便的執行緒池建立方式。
1.Executors#newFixedThreadPool(int nThreads) 固定執行緒池
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
可以看到用的workQueue是LinkedBlockingQueue,說明佇列無限長,執行緒池最大值就是入參nThreads。
2.Executors#newCachedThreadPool() 執行緒池為Integer.MAX_VALUE的執行緒池
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
SynchronousQueue是容量為1的阻塞佇列,所以新增任務的時候會新起執行緒,執行緒數最大值為Integer.MAX_VALUE
3.Executors#newSingleThreadPool() 執行緒數為1的執行緒池
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
不用說了,執行緒數最大為1。
TaskFuture
繼承於Future,能夠實現帶返回值的執行緒執行結果。 幾個特殊方法, isDone() get(),get(Long timeOut,TimeUtil