shutdown和awaitTermination为接口ExecutorService定义的两个方法,一般情况配合使用来关闭线程池。

方法简介
shutdown方法:将线程池状态置为SHUTDOWN。平滑的关闭ExecutorService,当此方法被调用时,ExecutorService停止接收新的任务并且等待已经提交的任务(包含提交正在执行和提交未执行)执行完成。当所有提交任务执行完毕,线程池即被关闭。

awaitTermination方法:接收人timeout和TimeUnit两个参数,用于设定超时时间及单位。当等待超过设定时间时,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。

shutdownNow方法:将线程池状态置为STOP。跟shutdown()一样,先停止接收外部提交的任务,忽略队列里等待的任务,尝试将正在跑的任务interrupt中断,返回未执行的任务列表。

具体实例1
普通任务处理类:

package com.secbro.test.thread;

import java.util.concurrent.Callable;

/**
* @author zhuzhisheng
* @Description
* @date on 2016/6/1.
*/
public class Task implements Callable{
@Override
public Object call() throws Exception {
System.out.println("普通任务");
return null;
}
}

长时间任务处理类:

package com.secbro.test.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit; /**
* @author zhuzhisheng
* @Description
* @date on 2016/6/1.
*/
public class LongTask implements Callable{
@Override
public Object call() throws Exception {
System.out.println("长时间任务");
TimeUnit.SECONDS.sleep(5);
return null;
}
}

测试类:

package com.secbro.test.thread;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; /**
* @author zhuzhisheng
* @Description
* @date on 2016/6/1.
*/
public class TestShutDown { public static void main(String[] args) throws InterruptedException{
ScheduledExecutorService service = Executors.newScheduledThreadPool(4); service.submit(new Task());
service.submit(new Task());
service.submit(new LongTask());
service.submit(new Task()); service.shutdown(); while (!service.awaitTermination(1, TimeUnit.SECONDS)) {
System.out.println("线程池没有关闭");
} System.out.println("线程池已经关闭");
} }

输出结果为:

普通任务
普通任务
长时间任务
普通任务
线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池已经关闭

具体实例2

public class ThreadPoolHelper {

    private static final Logger logger = Logger.getLogger(ThreadPoolHelper.class);

    private static final int POOL_SIZE = 40;//线程池大小

    //订单任务线程池

    private static ThreadPoolExecutor comitTaskPool =(ThreadPoolExecutor) new ScheduledThreadPoolExecutor(POOL_SIZE,
new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build()); /**
* 执行订单任务
*
* @param comitTask
*/
public static void executeTask(Runnable comitTask) {
comitTaskPool.execute(comitTask);
logger.debug("【线程池任务】线程池中线程数:" + comitTaskPool.getPoolSize());
logger.debug("【线程池任务】队列中等待执行的任务数:" + comitTaskPool.getQueue().size());
logger.debug("【线程池任务】已执行完任务数:" + comitTaskPool.getCompletedTaskCount());
} /**
* 关闭线程池
*/
public static void shutdown() {
logger.debug("shutdown comitTaskPool...");
comitTaskPool.shutdown();
try {
if (!comitTaskPool.isTerminated()) {
logger.debug("直接关闭失败[" + comitTaskPool.toString() + "]");
comitTaskPool.awaitTermination(3, TimeUnit.SECONDS);
if (comitTaskPool.isTerminated()) {
logger.debug("成功关闭[" + comitTaskPool.toString() + "]");
} else {
logger.debug("[" + comitTaskPool.toString() + "]关闭失败,执行shutdownNow...");
if (comitTaskPool.shutdownNow().size() > 0) {
logger.debug("[" + comitTaskPool.toString() + "]没有关闭成功");
} else {
logger.debug("shutdownNow执行完毕,成功关闭[" + comitTaskPool.toString() + "]");
}
}
} else {
logger.debug("成功关闭[" + comitTaskPool.toString() + "]");
}
} catch (InterruptedException e) {
logger.warn("接收到中断请" + comitTaskPool.toString() + "停止操作");
}
}
}

最新文章

  1. 动态加载js和css
  2. 【转】CentOS下载版本介绍
  3. ios app打ipa包
  4. oracle psql 调优
  5. Redis适用于高并发的递增、递减功能
  6. session服务器Nginx+Tomcat+Memcached集群Session共享
  7. 使用日志服务LogHub替换Kafka
  8. 超强Altium Designer焊盘为梅花状连接,过孔为直接连接的方法
  9. windows下fitness python版本安装测试
  10. ThinkPHP 3.1.2 模板的使用技巧
  11. WebGIS中前端JS生成等值面方法探讨
  12. asp.net core mvc上传大文件解决方案
  13. 定位公网丢包的工具 mtr
  14. Modification Default Identity Table
  15. ajax基本原理
  16. os.path.join路径拼接
  17. IDEA插件开发总结
  18. 第七周psp例行报告
  19. BTN事件的响应区域
  20. RS中的关系引用不明确以及行列自动添加了追溯

热门文章

  1. Go开发之路 -- 函数详解
  2. vue项目中vscode格式化配置和eslint配置冲突
  3. 使用ArcGIS Earth矢量化高精度的数据(kml转图层转shp/要素类)
  4. 广州.NET微软技术俱乐部微信群各位技术大牛的blog
  5. macos 安装sublime text 3,如何安装插件
  6. 爬虫基础--IO多路复用单线程异步非阻塞
  7. iOS 常用三方(持续更新)
  8. spring boot 扫描不到自定义Controller
  9. python3 shell 中添加清屏
  10. 【Python 17】B分R计算器1.0(数值类型)