java线程池的一个小坑:shutdown之后线程并不会停止运行
问题背景
最近我想要实现一个这样的功能:在线程运行超过一段时间之后就向主程序抛出一个异常,并停止这个线程。
其具体的应用场景是一个任务由多个子任务组成,每个子任务单独一个线程,如果某个子任务长时间未完成就认为这个子任务失败(可能是因为网络原因卡死了),就需要把这个线程结束掉,然后等待调度器重新运行这个子任务。
(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之后线程并不会停止运行的更多相关文章
- Flash图解线程池 | 阿里巴巴面试官希望问的线程池到底是什么?
前言 前几天小强去阿里巴巴面试Java岗,止步于二面. 他和我诉苦自己被虐的多惨多惨,特别是深挖线程和线程池的时候,居然被问到不知道如何作答. 对于他的遭遇,结合他过了一面的那个嘚瑟样,我深表同情(加 ...
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
- go的变量redeclare的问题,golang的一个小坑
go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int 然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...
- mysql url 连接配置的一个小坑。 工作中不会遇到。 学习的时候会
<property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> & ...
- 关于sniff函数的一个小坑
最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数.
- Github作为图床的一个小坑
Github作为图床的一个小坑 前言 听了少铭同学建议把github作为图床,结果遇到了一个小坑,总是显示不出来图片. 问题描述与解决 形如下的链接是显示不出来的: https://github.co ...
- Go的List操作上的一个小“坑”
转自http://sharecore.net/blog/2014/01/09/the-trap-in-golang-list/ 一直想不清楚一个问题,简单设计的东西到底是“坑多”还是“坑少”呢? 复杂 ...
- ThreadPoolExecutor线程池的一个面试题
问题:现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为5,此时有4个任务同时进来,问:线程池会创建几条线程? 如 ...
随机推荐
- RPC实战与核心原理之负载均衡
负载均衡:节点负载差距这么大,为什么收到的流量还一样? 回顾 "多场景的路由选择",其核心就是"如何根据不同的场景控制选择合适的目标机器" 问题 RPC 框架有 ...
- B1014 福尔摩斯的约会 && A1061 Dating
描述 大侦探福尔摩斯接到一张奇怪的字条: 我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm 大侦探很快就明白了, ...
- length与capacity
package javaBasic; public class DifferenceLengthCapacity { public static void main(String[] args) { ...
- Linux Shell整理小知识
Linux Shell整理小知识 介绍两个命令 1. shopt shell option, 即shell的一些选项设置 [root@localhost ~]# shopt autocd off cd ...
- kubernetes部署kafka集群
一.kafka介绍 kafka是一个分布式.多副本.多订阅者.分区的,基于zoopkeeper协调的分布式日志系统.其主要特点为: 1.以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上 ...
- OceanBase 中的非机动车道 —— SQL 限流技巧分享
首先为大家推荐这个 OceanBase 开源负责人老纪的公众号 "老纪的技术唠嗑局",会持续更新和 OceanBase 相关的各种技术内容.欢迎感兴趣的朋友们关注! 定场诗< ...
- Model Context Protocol C# SDK v0.3.0-preview.1 版本发布
Model Context Protocol (MCP) 是一种新兴的开放标准,旨在实现大型语言模型(LLM)与外部数据源及工具之间的无缝集成.v0.3.0-preview.1 版本是这一标准的重要更 ...
- Cursor生成UI,加一步封神
用 Cursor 做 UI,有两种最简单又有效的方法,一个免费一个付费,不管你要做网页 UI 还是应用程序 UI,都能用. 我这里不推荐直接用 Cursor 自带模型生成 UI,模型生成出来的效果比较 ...
- C#:wpf ui 4.0 是如何实现页面导航的?
wpf ui 介绍 wpf ui 是一款我比较喜欢的wpf ui界面开源库,目前已经获得了8.5颗stars,还是很受欢迎的: wpf ui在vs中也提供了快速开发模板: 让wpf开发者可以快速进行应 ...
- Xamarin.Android C#layout_weight错误:必须指定一个单位,例如“ px”
https://mlog.club/article/5879658 解决办法: 关闭VS 删除解决方案根目录中的.vs文件夹 开始VS