首页 > 其他 > 详细

ExecutorService使用

时间:2019-12-04 15:05:47      阅读:103      评论:0      收藏:0      [点我收藏+]

前言 

  最近需要在规定的时间内处理大量的数据,首先是在单线程的情况下完成的,但是效率比较慢,规定时间里完成不了。因此,考虑到了多线程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 "";
}
}
}
 
 
 
 

 

 

 

ExecutorService使用

原文:https://www.cnblogs.com/mgdxh/p/11981548.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!