1.类介绍:
Executor接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。
它只有一个方法excute(Runnable command),你可以复写此方法,让Runnable同步或异步执行
ExecutorService是Executor的一个子接口,提供了管理线程的方法,可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。
ThreadPoolExecutor是ExecutorService的一个实现类,它通常与Executors工厂一起使用。
下面的方法取自Executors类
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
这里面使用ThreadPoolExecutor创建一个线程数为nThreads的线程池。
类似的工厂方法还有很多,可以查看JDK
ExecutorService的常用方法:
invokeAll 执行所有任务,全部执行完毕后返回每个任务的结果(FutureList),包括每个任务的状态
invokeAny 与上面方法的区别是,只返回一个任务成功执行结果Future
submit 提交一个Task去执行,并返回执行结果
awaitTermination 当执行线程中断、超时,或调用了shutdown方法后,阻塞直到所有的Task都执行结束。
shutdown 关闭所有执行过的Task,并不再接收新线程
isTerminated 如果所有Task都关闭则返回True,前提是调用过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;
}
//定义关闭方法
public static void awaitTerminationExecutor(long timeout, TimeUnit unit) {
getExecutor().shutdown();
try {
getExecutor().awaitTermination(timeout, unit);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
b.接下来是调用:
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. 类结构图
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