1.類介紹:
Executor接口提供一種將任務(wù)提交與每個任務(wù)將如何運行的機制(包括線程使用的細節(jié)、調(diào)度等)分離開來的方法。
它只有一個方法excute(Runnable command),你可以復(fù)寫此方法,讓Runnable同步或異步執(zhí)行
ExecutorService是Executor的一個子接口,提供了管理線程的方法,可為跟蹤一個或多個異步任務(wù)執(zhí)行狀況而生成 Future 的方法。
ThreadPoolExecutor是ExecutorService的一個實現(xiàn)類,它通常與Executors工廠一起使用。
下面的方法取自Executors類
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
這里面使用ThreadPoolExecutor創(chuàng)建一個線程數(shù)為nThreads的線程池。
類似的工廠方法還有很多,可以查看JDK
ExecutorService的常用方法:
invokeAll 執(zhí)行所有任務(wù),全部執(zhí)行完畢后返回每個任務(wù)的結(jié)果(FutureList),包括每個任務(wù)的狀態(tài)
invokeAny 與上面方法的區(qū)別是,只返回一個任務(wù)成功執(zhí)行結(jié)果Future
submit 提交一個Task去執(zhí)行,并返回執(zhí)行結(jié)果
awaitTermination 當執(zhí)行線程中斷、超時,或調(diào)用了shutdown方法后,阻塞直到所有的Task都執(zhí)行結(jié)束。
shutdown 關(guān)閉所有執(zhí)行過的Task,并不再接收新線程
isTerminated 如果所有Task都關(guān)閉則返回True,前提是調(diào)用過shutdown或shutdownNow
2.使用示例:
a.首先定義一個輔助類SystemConstant,大致方法如下:
//初始化一個線程池
public static ExecutorService getExecutor() {
if(PROCESS_EXECUTOR == null || PROCESS_EXECUTOR.isTerminated()) {
PROCESS_EXECUTOR = Executors.newFixedThreadPool(EXECUTOR_SIZE);
}
return PV_PROCESS_EXECUTOR;
}
//定義關(guān)閉方法
public static void awaitTerminationExecutor(long timeout, TimeUnit unit) {
getExecutor().shutdown();
try {
getExecutor().awaitTermination(timeout, unit);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
b.接下來是調(diào)用:
try {
SystemConstant.getExecutor().invokeAll(SystemUtils.toCallable(
new SystemUtils.CallableHandle<IPvProcess>() {
public void handle(Process process) throws Exception {
process.processLogs(logs, statDate);
}
}, prepareProcesses), perOutOfTime, TimeUnit.HOURS);
} catch (Exception e) {
logger.error(e);
}
SystemConstant.awaitTerminationProgramExecutor(allOutOfTime, TimeUnit.HOURS);
3. 類結(jié)構(gòu)圖
java.util.concurrent
Class ThreadPoolExecutor
java.lang.Object
java.util.concurrent.AbstractExecutorService
java.util.concurrent.ThreadPoolExecutor
- All Implemented Interfaces:
- Executor, ExecutorService
- Direct Known Subclasses:
- ScheduledThreadPoolExecutor