前言
最近需要在规定的时间内处理大量的数据,首先是在单线程的情况下完成的,但是效率比较慢,规定时间里完成不了。因此,考虑到了多线程ExecutorService类的使用。
1.实例化ExecutorService对象
ExecutorService demoExecutorService = new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>,new ThreadFactoryBuilder());
corePoolSize:核心线程数,创建之后不会被释放。
maximumPoolSize:最大线程数,最大线程数包含核心线程数和非核心线程数。当最大线程数大于核心线程数时,就会有非核心线程数的存在。此时,若非核心线程数空闲时,则会被回收。
keepAliveTime:非核心线程空闲时存活的最大时间,当超过这个时间就会被回收。
TimeUnit.MILLISECONDS:时间单位。
new LinkedBlockingQueue<Runnable>:存储需要执行的任务
2.实现Callable接口
新写一个类实现Callable接口并重写call()方法,将需要执行的逻辑放在call方法中。
class DemoRepairCall implements Callable<String>{
@Override
public String call() throws Exception {
try {
//需要多线程执行的业务逻辑代码
} catch (Exception e) {
return "";
}
}
}
3.往任务列表中添加任务
创建DemoRepairCall 对象,并使用ExecutorService的submit方法提交。submit提交单个任务,invokeAll批量运行所有任务。
for(int i=0;i<30;i++){
DemoRepairCall demo = new DemoRepairCall();
demoExecutorService.submit(demo);
}
4.关闭ExecutorService对象
使用ExecutorService的shutdown方法关闭ExecutorService对象。
try {
demoExecutorService.shutdown();
// (所有的任务都结束的时候,返回TRUE)
if (!demoExecutorService.awaitTermination(awaitTime, TimeUnit.DAYS)) {
// 超时的时候向线程池中所有的线程发出中断(interrupted)。
demoExecutorService.shutdownNow();
}
} catch (InterruptedException e) {
// awaitTermination方法被中断的时候也中止线程池中全部的线程的执行。
demoExecutorService.shutdownNow();
}
示例:
public static void main(String[] args) {
long awaitTime = 1;
ExecutorService demoExecutorService = new ThreadPoolExecutor(8, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(60), new ThreadFactoryBuilder().setNameFormat("alive-pool-%d").build());
//往任务列表中添加任务
for(int i=0;i<30;i++){
DemoRepairCall demo = new DemoRepairCall();
demoExecutorService.submit(demo);
}
try {
demoExecutorService.shutdown();
// (所有的任务都结束的时候,返回TRUE)
if (!demoExecutorService.awaitTermination(awaitTime, TimeUnit.DAYS)) {
// 超时的时候向线程池中所有的线程发出中断(interrupted)。
demoExecutorService.shutdownNow();
}
} catch (InterruptedException e) {
// awaitTermination方法被中断的时候也中止线程池中全部的线程的执行。
log.info("awaitTermination interrupted: ", e);
demoExecutorService.shutdownNow();
}
}
static class DemoRepairCall implements Callable<String>{
@Override
public String call() throws Exception {
try {
long startTime = System.currentTimeMillis();
log.info("执行多线程程序。");
log.info("耗时{}ms",System.currentTimeMillis() - startTime);
return "";
} catch (Exception e) {
log.info("异常", e);
return "";
}
}
}
原文:https://www.cnblogs.com/mgdxh/p/11981548.html