问题背景

最近我想要实现一个这样的功能:在线程运行超过一段时间之后就向主程序抛出一个异常,并停止这个线程。

其具体的应用场景是一个任务由多个子任务组成,每个子任务单独一个线程,如果某个子任务长时间未完成就认为这个子任务失败(可能是因为网络原因卡死了),就需要把这个线程结束掉,然后等待调度器重新运行这个子任务。

(java的任何网络请求都可能会出现永久卡死的情况,这个一定要考虑到!!)

最初的解决方案及问题

最开始我们参考了网上最常见的解决办法,就是使用ExecutorService+Future,使用Future类的get方法来实现。但是后面实际部署上去之后发现,线程超时的异常被截获到了,但是线程依然在运行。

即使是使用了future.cancel和executorService.shutdown,正在运行的线程也不会停止,可以通过以下的示例代码来验证:

ExecutorService executorService= Executors.newSingleThreadExecutor();
Future<Object> future=executorService.submit(()->{
while (true){
try {
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
} System.out.println("Test");
} // return null;
}); try {
Object ret=future.get(3, TimeUnit.SECONDS);
System.out.println("Got it");
}catch (Exception e){
while(!future.cancel(false)){
System.out.println("Cancel failed");
}
System.err.println("Error "+future.isCancelled());
e.printStackTrace();
}finally {
executorService.shutdown();
}

修改后的解决方案

个人推测应该是不存在可以强行停止线程的api,我们能做的只能是使用一个flag让线程自己停止运行,这个flag可以考虑使用executorService.isShutdown(),这个具体怎么做就得具体问题具体分析了,以下是修改后的示例代码:

ExecutorService executorService= Executors.newSingleThreadExecutor();
Future<Object> future=executorService.submit(()->{
while (!executorService.isShutdown()){
try {
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
} System.out.println("Test");
} return null;
}); try {
Object ret=future.get(3, TimeUnit.SECONDS);
System.out.println("Got it");
}catch (Exception e){
while(!future.cancel(false)){
System.out.println("Cancel failed");
}
System.err.println("Error "+future.isCancelled());
e.printStackTrace();
}finally {
executorService.shutdown();
}

java线程池的一个小坑:shutdown之后线程并不会停止运行的更多相关文章

  1. Flash图解线程池 | 阿里巴巴面试官希望问的线程池到底是什么?

    前言 前几天小强去阿里巴巴面试Java岗,止步于二面. 他和我诉苦自己被虐的多惨多惨,特别是深挖线程和线程池的时候,居然被问到不知道如何作答. 对于他的遭遇,结合他过了一面的那个嘚瑟样,我深表同情(加 ...

  2. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  3. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  4. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

  5. go的变量redeclare的问题,golang的一个小坑

    go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int   然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...

  6. mysql url 连接配置的一个小坑。 工作中不会遇到。 学习的时候会

    <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> & ...

  7. 关于sniff函数的一个小坑

    最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数.

  8. Github作为图床的一个小坑

    Github作为图床的一个小坑 前言 听了少铭同学建议把github作为图床,结果遇到了一个小坑,总是显示不出来图片. 问题描述与解决 形如下的链接是显示不出来的: https://github.co ...

  9. Go的List操作上的一个小“坑”

    转自http://sharecore.net/blog/2014/01/09/the-trap-in-golang-list/ 一直想不清楚一个问题,简单设计的东西到底是“坑多”还是“坑少”呢? 复杂 ...

  10. ThreadPoolExecutor线程池的一个面试题

    问题:现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为5,此时有4个任务同时进来,问:线程池会创建几条线程? 如 ...

随机推荐

  1. WPF后台自动添加控件Demo

    xaml <Window x:Class="EBPlugIn2.EBPlugIn2_YJW_13" xmlns="http://schemas.microsoft. ...

  2. java.lang.StringIndexOutOfBoundsException: String index out of range: 1

    笔者源码如下: package javaPractice; import java.util.*; public class TestScanner { public static void main ...

  3. Java安全01——URLDNS链分析与利用

    URLDNS链分析与利用 作用 URLDNS 利用链只能发起 DNS 请求,不能执行命令,所以用于漏洞的检测 不限制JDK版本,使用Java内置类,无第三方依赖要求 可以进行无回显探测 利用链 ​ 利 ...

  4. 【公众号搬运】React-Native开发鸿蒙NEXT(5)

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  5. 使用SimpleDateFormat获取指定时区时间

    摘要:使用SimpleDateFormat把时间戳转换成指定格式的.指定时区的字符串.   SimpleDateFormat是Java中的一个日期格式化类,继承了DateFormat,可以实现日期时间 ...

  6. 代码随想录第九天 | 栈与队列part01

    那很好了,时间来到了第九天, 理论基础 了解一下 栈与队列的内部实现机制,文中是以C++为例讲解的. 文章讲解:https://programmercarl.com/栈与队列理论基础.html 232 ...

  7. 钓鱼攻击(phishing)详解和实现过程

    钓鱼攻击 定义:钓鱼攻击是一种常见的网络攻击手段,攻击者通过伪装成合法的网站.邮件或信息,诱骗用户提供敏感信息,如用户名.密码.银行卡号等,从而达到非法获取用户数据或进行欺诈的目的. 网络钓鱼(phi ...

  8. 使用HTML完成一个最low的页面

    1 <body> 2 <div style="background: burlywood"> 3 <h1 style="text-align ...

  9. 2025国内五大MES系统排名探秘:从核心架构到选型指南,解锁智造升级最优解

    在智能制造浪潮席卷全球的今天,MES系统(制造执行系统)作为连接企业管理层与车间生产层的"神经中枢",其重要性日益凸显.它能有效打通信息孤岛,实现生产全流程透明化.可控化与智能化, ...

  10. SpringBoot + Junit5 + MockMvc 写单元测试

    1.1  junit5  版本5.6.0  pom文件如下: <properties> <junit.jupiter.version>5.6.0</junit.jupit ...