判断线程池任务执行完成
前言
线程池执行任务,有时候,我们需要知道它是什么时候完成的。
1、.shutdown()、.isTerminated()进行判断
下面方法的解释:
当调用ExecutorService.shutdown方法的时候,线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。解释退出了,如果在给新任务就会报错,一般不使用这种方法,建议使用第二种,这样线程池还可以用。
for(Long key:map.keySet()){final List<Long> idsThread = ids ;threadPoolUtils.execute(()->{List<Long> idParams = idsThread.subList(key.intValue()-1, map.get(key).intValue());final List<CouponItemGood> couponItemGoodFinal = couponItemGoodMapper.dataCpuponItemGoodfindByParamsIds(idParams);if (listKeyMonitor(couponItemGoodFinal, true,couponCheckVailds,mode)){return;}});}threadPoolUtils.getThreadPoolExecutor().shutdown();while(true){ if(threadPoolUtils.getThreadPoolExecutor().isTerminated()){ System.out.println("所有的子线程都结束了!"); break; } Thread.sleep(10000); //防止while判断过快,浪费资源,这里我设置为10秒大家看情况设置}
1.2、shutdown()、shutdownNow()、awaitTerminate(long timeout,TimeUnit unit)区别
1、shutdown()
问:shutdown()有什么功能?
答:阻止新来的任务提交,对已经提交了的任务不会产生任何影响。当已经提交的任务执行完后,它会将那些闲置的线程(idleWorks)进行中断,这个过程是异步的。
问:如何阻止新来的任务提交?
答:通过将线程池的状态改成SHUTDOWN,当再将执行execute提交任务时,如果测试到状态不为RUNNING,则抛出rejectedExecution,从而达到阻止新任务提交的目的。
问:为何对提交的任务不产生任何影响?
答:在调用中断任务的方法时,它会检测workers中的任务,如果worker对应的任务没有中断,并且是空闲线程,它才会去中断。 另外的话,workQueue中的值,还是按照一定的逻辑顺序不断的往works中进行输送的,这样一来,就可以保证提交的任务按照线程本身的逻辑执行,不受到影响。
2、shutdownNow()
问:shutdownNow()有什么功能?
答:阻止新来的任务提交,同时会中断当前正在运行的线程,即workers中的线程。 另外它还将workQueue中的任务给移除,并将这些任务添加到列表中进行返回。
问:如何阻止新来的任务提交?
答:通过将线程池的状态改成STOP,当再将执行execute提交任务时,如果测试到状态不为RUNNING,则抛出rejectedExecution,从而达到阻止新任务提交的目的.
问:如果我提交的任务代码块中,正在等待某个资源,而这个资源没到,但此时执行shutdownNow(),会出现什么情况?
答:当执行shutdownNow()方法时,如遇已经激活的任务,并且处于阻塞状态时,shutdownNow()会执行1次中断阻塞的操作,此时对应的线程报InterruptedException,如果后续还要等待某个资源,则按正常逻辑等待某个资源的到达。例如,一个线程正在sleep状态中,此时执行shutdownNow(),它向该线程发起interrupt()请求,而sleep()方法遇到有interrupt()请求时,会抛出InterruptedException(),并继续往下执行。在这里要提醒注意的是,在激活的任务中,如果有多个sleep(),该方法只会中断第一个sleep(),而后面的仍然按照正常的执行逻辑进行。
3、awaitTermination(long timeout,TimeUnit unit)
简单来说,awaitTermination会一直等待,直到线程池状态为TERMINATED或者,等待的时间到达了指定的时间。
exec.shutdown();exec.awaitTermination(1, TimeUnit.HOURS);
2、使用执行任务数量进行判断
for(Long key:map.keySet()){final List<Long> idsThread = ids ;threadPoolUtils.execute(()->{List<Long> idParams = idsThread.subList(key.intValue()-1, map.get(key).intValue());final List<CouponItemGood> couponItemGoodFinal = couponItemGoodMapper.dataCpuponItemGoodfindByParamsIds(idParams);if (listKeyMonitor(couponItemGoodFinal, true,couponCheckVailds,mode)){return;}});
}//当线程池完成的线程数等于线程池中的总线程数
boolean allThreadsIsDone = threadPoolUtils.getThreadPoolExecutor().getTaskCount() == threadPoolUtils.getThreadPoolExecutor().getCompletedTaskCount();
log.info("\n"+allThreadsIsDone+"当前线程池完成状态:线程池工作任务数量"+threadPoolUtils.getThreadPoolExecutor().getTaskCount()+"线程池完成工作数量"+threadPoolUtils.getThreadPoolExecutor().getCompletedTaskCount());
while (!allThreadsIsDone) {allThreadsIsDone = threadPoolUtils.getThreadPoolExecutor().getTaskCount() == threadPoolUtils.getThreadPoolExecutor().getCompletedTaskCount();if (allThreadsIsDone) {break;}try {log.info("\n"+allThreadsIsDone+"当前线程池完成状态:线程池工作任务数量"+threadPoolUtils.getThreadPoolExecutor().getTaskCount()+"线程池完成工作数量"+threadPoolUtils.getThreadPoolExecutor().getCompletedTaskCount());Thread.sleep(10000); //睡上10秒钟吧} catch (InterruptedException e) {e.printStackTrace();}
}
判断线程池任务执行完成相关推荐
- 如何判断线程池已经执行完所有任务了?
作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 很多场景下,我们需要等待线程池的所有任务都执行完,然后再进行下一步操作. ...
- 判断线程池中某个线程是否执行完成
目录 1.先写结果 2.判断某个线程是否执行完成(不使用线程池) 3.在线程池中不能使用isAlive判断线程状态的原因 3-1.错误示例 3-2.创建线程工厂 3-3.创建线程方法(ThreadPo ...
- python 判断线程是否执行完毕_判断线程池中的线程是否全部执行完毕
在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...
- 判断线程池中的线程是否全部执行完毕
在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...
- 5种方法,教你判断线程池是否全部完成
点击关注公众号,利用碎片时间学习 概述 最近写小玩具的时候用到了 CountDownLatch 计数器,然后顺便想了想判断线程池全部结束有多少种方法. 在网上搜了下,可能有些没找到,但是我找到的有(所 ...
- 【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )
文章目录 一.EventBus 中主线程支持类 二.EventBus 中 AsyncPoster 分析 三.AsyncPoster 线程池 Runnable 任务类 一.EventBus 中主线程支持 ...
- JAVA编码(41)—— 线程池队列执行任务(ThreadPoolQueue)(1)
废话少说,上代码 package com.sinosoft;import java.util.concurrent.*;/*** Created by xushuyi on 2017/4/9.*/ p ...
- java线程池延期执行一次_Java使用者的延期执行
java线程池延期执行一次 在前面的博客文章(" 延迟执行Java的供应商 "),我引用礁HORSTMANN的陈述书中' 的Java SE8为真的很急关于lambda表达式','所 ...
- 线程池的执行原则及配置参数详解
池是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能.Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生 ...
- 记一次线程池任务执行异常
记一次线程池任务执行异常 参考文章: (1)记一次线程池任务执行异常 (2)https://www.cnblogs.com/hapjin/p/10012435.html (3)https://www. ...
最新文章
- 每天工作4小时的程序员【转】
- python excel处理框架_django框架基于模板 生成 excel(xls) 文件操作示例
- .net core 调用c dll_工具:搭建Camp;C,一睹模样
- 基于SOA的图书商城系统分析
- [转]Spring数据库读写分离
- python学习笔记8-列表、集合、字典推导式
- APScheduler Scheduler
- Java的几种路径总结
- android logo:内核、android开机动画
- union matlab,[转载]intersect,unique,union在matlab中的用法(I lo
- 类似金山打字的窗口打字游戏代码版--注释很多,不用讲解
- Java学习-Java系统介绍
- 百度如流首发AI智能办公标准 ,BATH持续发力企业办公
- 2022年最新用最简单粗暴的方式讲解:pytest简介,框架基础应用,运行方式,失败用例重跑。直击核心
- MaxScript入门指引系列(五)数组和Visual MaxScript editor
- forwardRef 的详解及使用
- lenovo服务器换系统重装系统_thinkserver服务器怎么重装系统?
- 2009年中国软件百强企业名单
- 半钧先生:分享一波超赞的冬至文案,句句暖到心!
- 致曾经那个优秀的女孩儿