前言

线程池执行任务,有时候,我们需要知道它是什么时候完成的。

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();}
}

判断线程池任务执行完成相关推荐

  1. 如何判断线程池已经执行完所有任务了?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 很多场景下,我们需要等待线程池的所有任务都执行完,然后再进行下一步操作. ...

  2. 判断线程池中某个线程是否执行完成

    目录 1.先写结果 2.判断某个线程是否执行完成(不使用线程池) 3.在线程池中不能使用isAlive判断线程状态的原因 3-1.错误示例 3-2.创建线程工厂 3-3.创建线程方法(ThreadPo ...

  3. python 判断线程是否执行完毕_判断线程池中的线程是否全部执行完毕

    在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...

  4. 判断线程池中的线程是否全部执行完毕

    在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...

  5. 5种方法,教你判断线程池是否全部完成

    点击关注公众号,利用碎片时间学习 概述 最近写小玩具的时候用到了 CountDownLatch 计数器,然后顺便想了想判断线程池全部结束有多少种方法. 在网上搜了下,可能有些没找到,但是我找到的有(所 ...

  6. 【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )

    文章目录 一.EventBus 中主线程支持类 二.EventBus 中 AsyncPoster 分析 三.AsyncPoster 线程池 Runnable 任务类 一.EventBus 中主线程支持 ...

  7. JAVA编码(41)—— 线程池队列执行任务(ThreadPoolQueue)(1)

    废话少说,上代码 package com.sinosoft;import java.util.concurrent.*;/*** Created by xushuyi on 2017/4/9.*/ p ...

  8. java线程池延期执行一次_Java使用者的延期执行

    java线程池延期执行一次 在前面的博客文章(" 延迟执行Java的供应商 "),我引用礁HORSTMANN的陈述书中' 的Java SE8为真的很急关于lambda表达式','所 ...

  9. 线程池的执行原则及配置参数详解

    池是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能.Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生 ...

  10. 记一次线程池任务执行异常

    记一次线程池任务执行异常 参考文章: (1)记一次线程池任务执行异常 (2)https://www.cnblogs.com/hapjin/p/10012435.html (3)https://www. ...

最新文章

  1. 每天工作4小时的程序员【转】
  2. python excel处理框架_django框架基于模板 生成 excel(xls) 文件操作示例
  3. .net core 调用c dll_工具:搭建Camp;C,一睹模样
  4. 基于SOA的图书商城系统分析
  5. [转]Spring数据库读写分离
  6. python学习笔记8-列表、集合、字典推导式
  7. APScheduler Scheduler
  8. Java的几种路径总结
  9. android logo:内核、android开机动画
  10. union matlab,[转载]intersect,unique,union在matlab中的用法(I lo
  11. 类似金山打字的窗口打字游戏代码版--注释很多,不用讲解
  12. Java学习-Java系统介绍
  13. 百度如流首发AI智能办公标准 ,BATH持续发力企业办公
  14. 2022年最新用最简单粗暴的方式讲解:pytest简介,框架基础应用,运行方式,失败用例重跑。直击核心
  15. MaxScript入门指引系列(五)数组和Visual MaxScript editor
  16. forwardRef 的详解及使用
  17. lenovo服务器换系统重装系统_thinkserver服务器怎么重装系统?
  18. 2009年中国软件百强企业名单
  19. 半钧先生:分享一波超赞的冬至文案,句句暖到心!
  20. 致曾经那个优秀的女孩儿

热门文章

  1. 超强大的数学计算器——WolframAlpha(含安卓下载连接)
  2. svchost.exe 上传下载占用大量资源
  3. SQLServer CTE 递归查询
  4. “假努力”与“假关心”
  5. python爬虫学习之路1
  6. 看完这篇,你也可以实现一个360度全景插件
  7. 侯捷老师c++面向对象高级编程
  8. Android 清理大师产品的具体实现(一)QQ专清
  9. Linux手动释放显卡内存
  10. REMIX智能合约实例BALLOT分析