一、java ExecutorService实现

创建ExecutorService变量
private ExecutorService executor = null

2.执行对应任务时,首先生成线程池

executor = Executors.newFixedThreadPool(线程池大小);

3.循环执行线程

for (String str : ids) {

executor.submit(new Callable<Void>() {

@Override

public Void call() throws Exception {

......;//线程执行具体内容

return null;

}

});

}

4.关闭线城池, shutdown关闭线城池,执行后程序会继续往下进行,线城池会等待所有线程线程执行完毕后关闭。

executor.shutdown();

5.设置阻塞等待awaitTermination, awaitTermination的作用是阻塞程序往下进行,使用之后程序会在所有线程执行完毕,关闭线城池之后才可以继续进行。但是如果超过等待时间则会抛出InterruptedException异常

try {

//设置最大阻塞时间,所有线程任务执行完成再继续往下执行

executor.awaitTermination(1, TimeUnit.HOURS);

long endTime = System.currentTimeMillis();

} catch (InterruptedException e) {

}

@Service

public class DataImpl extends DataService {

//设置线城池大小

public static final int THREAD_POOL_FIX_SIZE = 100;

@Autowired

private DataDao dataDao;

//线城池服务

private ExecutorService executor = null;

public void createData(Integer totalSize, Integer pageSize) {

//由于每次线程执行完毕会关闭线城池,所以要重新获取线城池

executor = Executors.newFixedThreadPool(THREAD_POOL_FIX_SIZE);

//多线程调用

for(List<String> id :ids){

executor.submit(new Callable<Void>() {

@Override

public Void call() throws Exception {

createData(id);

return null;

}

});

}

//关闭线城池

executor.shutdown();

try {

//设置最大阻塞时间,所有线程任务执行完成再继续往下执行

executor.awaitTermination(24, TimeUnit.HOURS);

long endTime = System.currentTimeMillis();

logger.info("=====================结束,用时"+ (endTime-startTime) + "毫秒" );

} catch (InterruptedException e) {

logger.info("======================超时" );

}

}

private void createData(String id){

……

}

}

*注:1.Executors.newFixedThreadPool(THREAD_POOL_FIX_SIZE);要在每次调用方法的时候创建,线程全部执行完成之后shundown(),释放所有线程,这样可以保证执行任务时生成足够线程,线程执行完立即释放。

2. ExecutorService可以写在没个类内,单独问此类使用,不同类之间互不干扰;也可以也成公用方法,写成公用方法后也会变成多类(多任务共享)同Spring线城池类似。

二、Spring 配置线程池(threadPoolTaskExecutor)

corePoolSize: 线程池维护线程的最少数量

keepAliveSeconds  线程池维护线程所允许的空闲时间

maxPoolSize   线程池维护线程的最大数量

queueCapacity 线程池所使用的缓冲队列

rejectedExecutionHandler 线程池拒绝处理策略

当一个任务通过execute(Runnable)方法欲添加到线程池时:

l  如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。

l  如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

l  如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。

l  如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

l  当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

*注:1.spring 配置的线城池(threadPoolTaskExecutor)由于是spring创建注入的,在首次使用之后,会一直保持corePoolSize个空闲线程,它只会把多余的空闲线程在keepAliveSeconds 时间之后释放,而且线城池不能调用shutdown()方法,否则再次调用,由于线程池已经关闭,会报错。

2. threadPoolTaskExecutor也可以在配置文件配置多个线城池,防止多有任务之间竞争,或者由于不同任务使用的线城池大小不同等情况。

三、ExecutorService与threadPoolTaskExecutor对比

---------------------
作者:黑桃K_程序猿
来源:CSDN
原文:https://blog.csdn.net/kai763253075/article/details/53033853

java 线程池(ExecutorService与Spring配置threadPoolTaskExecutor)的更多相关文章

  1. [Java线程] Java线程池ExecutorService

    示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...

  2. 【Java线程】Java线程池ExecutorService

    示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...

  3. Java线程池ExecutorService和CountDownLatch的小例子

    import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java ...

  4. Java线程池 ExecutorService

    一.ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法:  ...

  5. Java线程池 ExecutorService了解一下

    本篇主要涉及到的是java.util.concurrent包中的ExecutorService.ExecutorService就是Java中对线程池的实现. 一.ExecutorService介绍 E ...

  6. Java线程池ExecutorService

    开篇前,我们先来看看不使用线程池的情况: new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override ...

  7. Java线程池ExecutorService 代码备忘

    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5)创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 p ...

  8. java 线程池--ExecutorService

    一 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. new ...

  9. PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束

    PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束 ExecutorService并没有提供什么 isDone()或者isComplete()之类的方法. 作者Atti ...

随机推荐

  1. 流媒体技术学习笔记之(十四)FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务

    FFmpeg推送视频流,Nginx RTMP模块转发,VLC播放器播放,实现整个RTMP直播 查看本机电脑的设备 ffmpeg -list_devices true -f dshow -i dummy ...

  2. iOS数据库操作之coredata详细操作步骤

    CHENYILONG Blog iOS数据库操作之coredata详细操作步骤 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/ ...

  3. HTML5 CSS Reset

    最近在学习HTML和CSS,发现一个不错的模板,放于此处. /* html5doctor.com Reset Stylesheet v1.6.1 Last Updated: 2010-09-17 Au ...

  4. mysql 1045 access denied for user 解决方法

    提示:1045 access denied for user 'root'@'localhost' using password yes方法一: # /etc/init.d/mysql stop #  ...

  5. IL反编译的实用工具Ildasm.exe

    初识Ildasm.exe——IL反编译的实用工具    https://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html   学 ...

  6. linux(CentOS7)中安装erlang(20.3)以及rabbitmq(3.7.9)的步骤以及一些注意事项

    首先下载安装包,之后先安装erlang,安装erlang需要很多依赖,所以一步步来: 首先 wxWidgets会报错,这个不是必须的,可以不安装,不影响 然后需要安装一些必须的依赖: yum inst ...

  7. MySQL V5.6.37升级到V5.6.38

    简单!万事先备份 cp /usr/my.cnf /home/xx/ cp -r /var/lib/mysql/dbname /home/xx/ mysqldump -u root -ppasswd - ...

  8. Linux 生产实习01

    Linux 生产实习01 标签(空格分隔): Linux 2018.07.02 相关软件下载地址:Linux Study 0x01. 安装 VMware Workstation VMware Work ...

  9. activiti helloworld 续

    todo... 8.开发流程部署功能 9.开发简单任务待办功能 10.开发简单任务办理功能 11.开发页面activiti流程跟踪图形展现功能 12.集成网页流程设计器

  10. java Comparator和Comparable(比较器)

    Comparable: 一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序,sort方法调用compareTo()方法里定义 ...