ThreadPoolExecutor 中的 shutdown() 、awaitTermination() 、 shutdownNow() 的用法
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() + "停止操作");
}
}
}
ThreadPoolExecutor 中的 shutdown() 、awaitTermination() 、 shutdownNow() 的用法的更多相关文章
- ThreadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
Java并发编程中在使用到ThreadPoolExecutor时,对它的三个关闭方法(shutdown().shutdownNow().awaitTermination())的异同点如下: shutd ...
- 原 线程池中shutdown()和shutdownNow()方法的区别
参考:shutdown和shutdownNow的区别 shutDown() 当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态.此时,则不能再往线程池中添加任何任务,否则将会抛出Reje ...
- JAVA线程池shutdown和shutdownNow的区别
一.区别介绍 shutDown() 当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态.此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionExcept ...
- 线程池中状态与线程数的设计分析(ThreadPoolExecutor中ctl变量)
目录 预备知识 源码分析 submit()源码分析 shutdownNow()源码分析 代码输出 设计目的与优点 预备知识 可以先看下我的另一篇文章对于Java中的位掩码BitMask的解释. 1.一 ...
- python中关于shutdown 和closesocket的彻底理解!
关于shutdown 和closesocket的彻底理解! shutdown 和closesocket 来,咱们彻底的来讨论一下这个shutdown 和closesocket 从函数调用上来分析(ms ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- C++中public、protected及private用法
转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容 ...
- [转载]C#中as和is关键字的用法
这篇文章主要介绍了C#中as和is关键字的用法的相关资料,需要的朋友可以参考下. 原文链接:http://www.jb51.net/article/80944.htm#comments 在程序中,进 ...
- [转载]jQuery中wrap、wrapAll和wrapInner用法以及区别
原文地址:jQuery中wrap.wrapAll和wrapInner用法以及区别作者:伊少君 原文: <ul> <li title='苹果'>苹果</li> ...
随机推荐
- #WEB安全基础 : HTML/CSS | 0x10.1更多表单
来认识更多的表单吧,增加知识面 我只创建了一个index.html帮助你认识它们 以下是代码 <!DOCTYPE html> <html> <head> <m ...
- win10系统下安装MySQLdb和pymysql
(1)使用的是Python3.6,想要使用MySQLdb, 需要先在https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient中下载相应版本的包 ...
- 自定义一个全屏的AlertDialog。
........... final MyDialog dialog = new MyDialog(this); LayoutInflater inflater = getLayoutInflater( ...
- Android 图片加载框架 Glide4.x
概述 Glide是一个图片加载框架,使得我们可以轻松的加载和展示图片 Glide4.x新增apply()来进行设置,apply可以调用多次,但是如果两次apply存在冲突的设置,会以最后一次为准 新增 ...
- EFCore使用JSON_VALUE查询json对象的值
EFCore使用JSON_VALUE查询json对象的值 Intro SqlServer 从2016开始支持 JSON 操作,可以使用 JSON_VALUE 查询 JSON 对象的某个属性值,更多介绍 ...
- Linux & Windows 环境下 Redis 安装与基本配置
索引: 目录索引 参看代码 GitHub: redis.txt 一.Linux (DeepinOS) 环境 .安装Redis服务 sudo apt-get install redis-server . ...
- PJSUA2开发文档--第七章 呼叫 Calls类
7 呼叫Calls 呼叫由Call类处理 7.1 子类化Call类 要使用Call类,应用程序应创建子类,如: class MyCall : public Call { public: MyCal ...
- 使用django 中间件在所有请求前执行功能
django中间是一个轻级,低耦合的插件,用来改变全局的输入和输出. 一 如何使用中间件 定义中间件 注册中间件 # 这是一个中间件代码片段的说明,在各个位置的代码将在何时执行 def simple_ ...
- Left Jion和where区别
首先,新建两张表A和B,然后插入6条数据到A表,3条数据到B表.语句如下: create table A( ID ,) not null, AName ) null ) create table B( ...
- maven常用仓库
==================2014-04-19添加========可访问=============================== http://nexus.openkoala.org/ ...