java 线程池超时_Java定时线程池停止超时任务
一、背景
题主最近遇到一个问题,本来通过ScheduledExecutorService线程池定时调度一个任务。奈何不知道为啥跑了2个多月,其中一个任务Hang住了,原本定时的任务则出现了问题。
关于定时线程池,好多人认为设置好频率(比如1Min),它会按照这个间隔按部就班的工作。但是,如果其中一次调度任务卡住的话,不仅这次调度失败,而且整个线程池也会停在这次调度上。
我们先从一个例子试着复现下问题:
public class pool {
private static class Runner implements Runnable {
@Override
public void run() {
try {
Thread.sleep(10000);
System.out.println(new Date());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ScheduledExecutorService service
= Executors.newScheduledThreadPool(1);
service.scheduleAtFixedRate(
new Runner(), 0, 1, TimeUnit.SECONDS);
}
}
先从Main看,启动一个定时线程池,每隔1S调度一次Runner。看上去,应该是1S调度一次,但是Runner的实际执行时间为10S,那多久会调度一次?答案是10S。
所以说,这个Runner不管什么原因挂掉了或者Hang住了,那这个定时调度线程池基本就废了。
二、解决方法
那我们应该怎么解决这个问题?如果说定时线程池有任务调度的超时策略就完美了,很可惜并没有。
我们想下在并发编程中,哪种方式有超时策略?
对,Future有,那我们可以结合Future,提供一种自动停止超时任务的方式,来解决某个任务Hang住的问题。
我们简单修改下,把sleep逻辑移动到Callable中,并在Runner中使用Future来控制超时。
public class pool {
private static class Caller implements Callable {
@Override
public Boolean call() {
try {
Thread.sleep(10000);
System.out.println(new Date());
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
private static class Runner implements Runnable {
@Override
public void run() {
ExecutorService excutor = Executors.newSingleThreadExecutor();
Future future = excutor.submit(new Caller());
try {
future.get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
System.out.println("timeout");
} catch (Exception e) {
e.printStackTrace();
} finally {
excutor.shutdownNow(); // 强制终止任务
}
}
}
public static void main(String[] args) {
ScheduledExecutorService service
= Executors.newScheduledThreadPool(1);
service.scheduleAtFixedRate(
new Runner(), 0, 1, TimeUnit.SECONDS);
}
}
备注:
- 实现逻辑相当于转移了,把本来应该调度的任务交给了另外一个Future单线程去执行。因为存在超时逻辑,不会影响原有定时线程池的执行。
- finally是否需要杀死线程池,因人而异。如果不杀死的话,那超时的任务会继续执行。
题外话:如果你有好的解决方式,欢迎和题主探讨。谢谢。
java 线程池超时_Java定时线程池停止超时任务相关推荐
- java阻塞超时_JAVA防线程阻塞(超时控制)
2.[代码]TimeoutThread /** * java线程超时控制的实现 * * 超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时后, 往往需要 ...
- java线程池面试题_java之线程池面试题
面试官:线程池有哪些?分别的作用是什么? 常用的线程池有: newSingleThreadExecutor newFixedThreadExecutor newCacheThreadExecutor ...
- JAVA线程六种状态_Java:线程的六种状态及转化
多线程概述及创建方式 Java:线程的六种状态及转化 关于线程的生命周期,网上书上说法不一,难以统一,本篇做一个总结: java.lang.Thread.State枚举类中定义了六种线程的状态,可以调 ...
- java线程中等待_Java:线程中的Thread.sleep():没有等待
线程没有睡觉我有问题. 我不能把我的整个代码放在这里.所以,为了重现,这里是一个等待5秒的基本代码. try { int millisec = 5000; System.out.println(new ...
- java daemon线程的作用_JAVA DAEMON线程的理解
java线程分两种:用户线程和daemon线程.daemon线程或进程就是守护线程或者进程,但是java中所说的daemon线程和linux中的daemon是有一点区别的. linux中的daemon ...
- java 编写线程公共类_Java实现线程间通信方式
线程间通信的模型: 共享内存 消息传递 我们来做道题理解一下 题目: 有两个线程A.B,A线程向一个集合里面依次添加元素"abc"字符串,一共添加十次,当添加到第五次的时候,希望B ...
- java多线程 修改优先级_Java多线程-线程的调度(优先级)
与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行. 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先 ...
- java线程交替执行_Java synchronized线程交替运行实现过程详解
背景 用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26 而且是交替形式 线程1输出A--线程二输出1 线程1输出B--线程二输出2 线程1输出C--线程二输出3 以此类 ...
- arraylist线程安全吗_Java的线程安全、单例模式、JVM内存结构等知识梳理
java技术总结 知其然,不知其所以然 !在技术的海洋里,遨游! 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本篇以一些问题开头,请先不看答案,自己思考一下,看一下你 ...
- java线程饥饿死锁_java并发-线程饥饿死锁测试
线程饥饿死锁 <Java并发编程实践>中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题.在单线程的Executor中,若果一个任务将另 ...
最新文章
- .net连接mysql数据_.net连接MYSQL数据库 转载
- 【PP MRP】MRP参数详解
- Java面试准备:15个Java面试问题
- 索引的使用规则和设计考虑
- 为什么defineProperty不能检测到数组长度的“变化”
- vue隐藏和显示元素
- edwardcmh@cnblogs
- MyBatis映射表问题
- S3C2440看门狗定时器(Watchdog)
- 十大排序算法——快速排序法【挖坑法、左右指针法、前后指针法和优化方式三路快排】(C语言)
- Oracle从10g升级到11g详细步骤
- 数据走进宫崎骏的动画世界
- 新发的日常小实验——使用IETester测试不同IE版本的浏览器,测试网页JS的兼容性(console未定义兼容测试)
- Flutter 日期转换
- 机器人会偷走你的饭碗吗——写作篇
- python 收银系统_实现全栈收银系统(Node+Vue)(一)
- 3D电影、游戏里的角色是怎么制作的?
- 与虎谋皮,饮鸩止渴,却有什么办法呢?
- 基于微信小程序的疫情智慧社区管理系统 计算机毕业设计 后台管理系统
- JCR分区(WOS或Thomson Reuters或汤姆森 路透)和中科院分区(附网址及查询方法)...
热门文章
- PDF文件电子签名怎么做?分享一个好用的签名工具
- firefox新标签页背景_如何更改或自定义Firefox的“新标签页”
- 用Python爬虫爬取链家网上的房源信息
- 爬虫实战 链家房源爬取(BeautifulSoup) 详细分析 2020最新
- 爬虫——获取页面源代码
- android卡通头像,Face V(卡通头像制作)
- marked + mathjax 实现支持数学公式的 markdown 转 html
- 【柒穆雨】平面设计好不好学?设计小白该如何学习平面设计
- Pulsar的Proxy支持和SNI路由 - 修改...
- everedit选择_everedit选择_文本编辑器软件EverEdit怎么样?EverEdit相关功能介绍