• BiaoDoo首页
  • 自主产品
       自主产品
       测试工具
       源码安全/质量测试云平台
       测试用例开发工具
       软件测试态势分析平台
       开源软件安全审计系统
       软件造价
       软件造价概算平台
       运维产品
       应用源码监测系统
       教学实训平台
       软件测试实验室平台
  • Micro Focus产品代理
       Micro Focus产品代理
       Fortify SCA
       Webinspect
       LoadRunner
       ALM/QualityCenter
       MF UFT
       MF Mobile Center
       Diagnostics
  • 其它产品
       其它产品
       AppScan(IBM)
       Klockwork Insight
       Coverity静态分析
       Black Duck--黑鸭软件成分分析
  • 安全产品
       安全产品
       U盾
  • 工程咨询
       工程咨询
       IT规划咨询
       软件造价概算
       软件架构评估
       信息工程监理
       测试体系咨询
  • 软件测试
       软件测试
       工程验收测试
       压力测试与优化
       产品认证测试
       专题测试
       医疗设备软件测试
       摇号软件测试
       科研项目验收
       软件故障诊断
       委托客制测试
       软件登记测试
       科技成果鉴定
       国产软件适配测试
  • 安全测试
       安全测试
       软件安全测试
       源码安全测试
       等级保护测评
       渗透测试
       风险评估
  • 企业服务
       企业服务
       系统保障与救援
       大数据服务
       ICP证书办理
       软件著作权
       首版次申报
  • 教育培训
       教育培训
       ISTQB认证
       软件产品检验员
       软件就业培训
       校企合作
       信息安全培训
  • 认证中心
       认证中心
       软件企业认证
       质量安全体系认证
       高新技术企业认证
       企业能力认证
       节能与绿色评价服务
       其它系统认证
  • 资讯中心
       资讯中心
       最新资讯
       政策法规
       技术方案
  • 开源测试 · 青云渡
       开源测试 · 青云渡
       技术文摘
       BiaoDoo开源
       常用工具
  • 全国网络
       全国网络
  • BiaoDoo
       BiaoDoo
       软件管控领导者
       合作伙伴
       FAQ
       加入我们
       招聘信息
       合作加盟
       联系我们
  • 测试外包
       测试外包
       离岸测试外包
       测试人才外协
  • 开源测试 · 青云渡

    ExecutorService 中 shutdown()、shutdownNow()、awaitTermination() 含义和区别

    ExecutorService 是 Java 提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过 ExecutorService 创建线程。


    使用 ExecutorService 类时,经常用到 shutdown() 、shutdownNow() 、awaitTermination() 3个方法,下面我们来说说它们的含义和三者的区别 。

    一、方法说明

    1、shutdown():停止接收新任务,原来的任务继续执行

    英文原意:关闭,倒闭;停工。 这里的意思是 关闭线程池与使用数据库连接池一样,每次使用完毕后,都要关闭线程池。

    1、停止接收新的submit的任务;
    2、已经提交的任务(包括正在跑的和队列中等待的),会继续执行完成;
    3、等到第2步完成后,才真正停止;

    2、shutdownNow():停止接收新任务,原来的任务停止执行

    1、跟 shutdown() 一样,先停止接收新submit的任务;

    2、忽略队列里等待的任务;

    3、尝试将正在执行的任务interrupt中断;

    4、返回未执行的任务列表;

    说明:它试图终止线程的方法是通过调用 Thread.interrupt() 方法来实现的,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt() 方法是无法中断当前的线程的。所以,shutdownNow() 并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。但是大多数时候是能立即退出的。

    3、awaitTermination(long timeOut, TimeUnit unit):当前线程阻塞

    timeout 和 TimeUnit 两个参数,用于设定超时的时间及单位

    当前线程阻塞,直到:

    • 等所有已提交的任务(包括正在跑的和队列中等待的)执行完;

    • 或者 等超时时间到了(timeout 和 TimeUnit设定的时间);

    • 或者 线程被中断,抛出InterruptedException

    然后会监测 ExecutorService 是否已经关闭,返回true(shutdown请求后所有任务执行完毕)或false(已超时)

    二、区别

    1、shutdown() 和 shutdownNow() 的区别

    shutdown() 只是关闭了提交通道,用submit()是无效的;而内部该怎么跑还是怎么跑,跑完再停。
    shutdownNow() 能立即停止线程池,正在跑的和正在等待的任务都停下了。

    2、shutdown() 和 awaitTermination() 的区别

    shutdown() 后,不能再提交新的任务进去;但是 awaitTermination() 后,可以继续提交。

    awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown() 不阻塞。

    三、总结

    1、优雅的关闭,用 shutdown()

    2、想立马关闭,并得到未执行任务列表,用shutdownNow()

    3、优雅的关闭,并允许关闭声明后新任务能提交,用 awaitTermination()

    4、关闭功能 【从强到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()


    BiaoDoo·智慧测试 | 让软件更可靠

    本站声明:内容源自https://blog.csdn.net/xiaojin21cen/article/details/81778651(CSDN)