Java ExcutorService优雅关闭方式解析
作者:migoo 发布时间:2023-11-25 19:21:48
标签:Java,Excutor,Service,关闭
关闭时可使用如下代码
public static void waitUntilTerminate(final ExecutorService executorService, final int timeout) {
try {
executorService.shutdown();
if (!executorService.awaitTermination(timeout, TimeUnit.SECONDS)) { //超时后直接关闭
executorService.shutdownNow();
}
} catch (InterruptedException e) { //awaitTermination 出现中断异常也将触发关闭
executorService.shutdownNow();
}
}
但是实际使用中,可能会出现即使使用了shutdownNow方法,还是无法终止线程的问题,那是因为你的线程无法被中断
shutdownNow方法简单理解就是给在运行的线程发一个中断信号,如果你的线程忽略这个信号,那就无法停下来
举个例子来说明这个问题
public class ShutDownUtilsTest {
private ExecutorService executorService;
@Before
public void init() {
executorService = Executors.newFixedThreadPool(1);
}
@Test
public void shutDownOKTest() {
ShutDownUtils.waitUntilTerminate(executorService, 1);
CommonUtils.sleep(1); //等待线程处理中断
Assert.assertTrue(executorService.isTerminated());
}
@Test
public void shutDownNowFailTest() {
executorService.execute(this::canNotStopThread);
ShutDownUtils.waitUntilTerminate(executorService, 0);
CommonUtils.sleep(1); //等待线程处理中断
Assert.assertFalse(executorService.isTerminated());
}
@Test
public void shutDownNowOKTest() {
executorService.execute(this::stopThread);
ShutDownUtils.waitUntilTerminate(executorService, 0);
CommonUtils.sleep(1); //等待线程处理中断
Assert.assertTrue(executorService.isTerminated());
}
private void canNotStopThread() {
for (long i = 0; i < Long.MAX_VALUE; i++) {
}
}
private void stopThread() {
for (long i = 0; i < Long.MAX_VALUE && !Thread.currentThread().isInterrupted(); i++) {
}
}
}
从上面的测试用例可以看到canNotStopThread无法被shutDownNow终止
然而stopThread可以被正常终止,因为通过Thread.currentThread().isInterrupted()在判断线程是否收到了中断信号
来源:https://www.cnblogs.com/migoo/p/11062154.html
0
投稿
猜你喜欢
- 最近有一款2048的游戏非常火,本文将来介绍一下使用OGEngine游戏引擎开发游戏2048。OGEngine引擎是开源的,我们很容易找到,
- 懒加载 ,也称为嵌套查询 需要查询关联信息时,使用 Mybatis 懒加载特性可有效的减
- 本文所需的数据库初始文件,Hibernate常用操作的完整示例代码(包含所有Hibernate操作所需jar文件)提供下载学习:http:/
- Java核心代码:public String getSmsInPhone() { final String SMS_URI_ALL = &q
- 需求:List<UserPojo> users = new ArrayList<>();//第一个user和第4个u
- 前言最近在知乎上面看到一篇关于程序员面试的问题,面试官问我们一般有几种注入的方法,这几种注入的方法分别在什么时候运用比合理,当时我看到这个时
- 介绍: 本文章主要针对web项目中的两个问题进行详细解析介绍:1- 页面跳转404,即controller转发无法跳转页面问题;2- 静态资
- 说明本案例使用Unity2019.3.8f1与AndropidStudio3.6.3源码git地址:https://github.com/g
- 说到导出 Excel,我们首先会想到 poi、jsxl 等,使用这些工具会显得笨重,学习难度大。今天学习使用 JeecgBoot 中的 Au
- using System;using System.Collections.Generic;using System.Linq;using
- Service是Android中一个类,它是Android 四大组件之一,使用Servic
- 一、Spring能做什么?Spring的主要目的是使J2EE易用和促进好编程习惯。倒置控制容器 Spring的设计核心是 org.sprin
- XML的特点是功能全面,但标签繁琐,格式复杂。在Web上使用XML现在越来越少,取而代之的是JSON这种数据结构。JSON是JavaScri
- 据JDK5的新特性,用For循环Map,例如循环Map的Keyfor(String dataKey : paraMap.keySet())&
- 本文以实例阐述了C++中形参与实参的区别,有助于读者加深对于C++形参与实参的认识。形参出现在函数定义中,在整个函数体内都可以使用, 离开该
- 第一种方式(只使用Caffeine)gradle添加依赖dependencies { implementation
- 部署到webapps目录启动本文使用的Spring版本为Spring6,SpringBoot版本为3,JDK为17,可能会和之前有细微不同,
- 这里以list为介绍:private static readonly T[] s_emptyArray = new T[0];public
- 安装完,或者绿色版解压完,先别打开Android Stduio。要先配置下Android Studio 的缓存路径。这个缓存文件主要是存放一
- 单例模式单例模式顾名思义就是单一的实例,涉及到一个单一的类,该类负责创建自己的对象,同时确保只有一个对象被创建,并且提供一种可以访问这个对象