多线程(线程池)遍历集合
线程池的参数说明:
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:最大空闲时间
unit:最大空闲时间单位
workQueue:任务队列
handler:拒绝策略,有以下四种
(1)ThreadPoolExecutor.AbortPolicy 丢弃任务,并抛出 RejectedExecutionException 异常。
(2)ThreadPoolExecutor.CallerRunsPolicy:该任务被线程池拒绝,由调用 execute方法的线程执行该任务。
(3)ThreadPoolExecutor.DiscardOldestPolicy : 抛弃队列最前面的任务,然后重新尝试执行任务。
(4)ThreadPoolExecutor.DiscardPolicy,丢弃任务,不过也不抛出异常。
也可以自己实现RejectedExecutionHandler接口来自定义拒绝策略
示例代码:
// 创建线程池遍历集合
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,2,2,
TimeUnit.SECONDS,new ArrayBlockingQueue<>(10),new ThreadPoolExecutor.AbortPolicy());
// 这是一个计数器操作,在线程池执行之前,给计数器指定数值(与要执行代码的次数一致)也就是students.size(),在线程池执行代码体里面要加上countDownLatch.countDown();代表每执行一次数值减少一,最后在循环体外边写上countDownLatch.await();代表等待计数器归零。
final CountDownLatch countDownLatch = new CountDownLatch(listData.size());
// 遍历集合
for (int i = 0; i < listData.size(); i++) {
threadPoolExecutor.submit(() -> {
try {
System.out.println("执行业务数据" + listData.get(i));
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
// 计数器减一
countDownLatch.countDown();
}
});
}
try {
// 阻塞当前线程,等待线程池所有任务执行完
countDownLatch.await();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
// 关闭显线程池
threadPoolExecutor.shutdown();
}
注意:上面的队列设置大一些,否则队列满了就会抛出异常
本文来自博客园,作者:喵师傅,转载请注明原文链接:https://www.cnblogs.com/wywblogs/p/17884510.html