一、背景

题主最近遇到一个问题,本来通过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定时线程池停止超时任务相关推荐

  1. java阻塞超时_JAVA防线程阻塞(超时控制)

    2.[代码]TimeoutThread /** * java线程超时控制的实现 * * 超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时后, 往往需要 ...

  2. java线程池面试题_java之线程池面试题

    面试官:线程池有哪些?分别的作用是什么? 常用的线程池有: newSingleThreadExecutor newFixedThreadExecutor newCacheThreadExecutor ...

  3. JAVA线程六种状态_Java:线程的六种状态及转化

    多线程概述及创建方式 Java:线程的六种状态及转化 关于线程的生命周期,网上书上说法不一,难以统一,本篇做一个总结: java.lang.Thread.State枚举类中定义了六种线程的状态,可以调 ...

  4. java线程中等待_Java:线程中的Thread.sleep():没有等待

    线程没有睡觉我有问题. 我不能把我的整个代码放在这里.所以,为了重现,这里是一个等待5秒的基本代码. try { int millisec = 5000; System.out.println(new ...

  5. java daemon线程的作用_JAVA DAEMON线程的理解

    java线程分两种:用户线程和daemon线程.daemon线程或进程就是守护线程或者进程,但是java中所说的daemon线程和linux中的daemon是有一点区别的. linux中的daemon ...

  6. java 编写线程公共类_Java实现线程间通信方式

    线程间通信的模型: 共享内存 消息传递 我们来做道题理解一下 题目: 有两个线程A.B,A线程向一个集合里面依次添加元素"abc"字符串,一共添加十次,当添加到第五次的时候,希望B ...

  7. java多线程 修改优先级_Java多线程-线程的调度(优先级)

    与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行. 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先 ...

  8. java线程交替执行_Java synchronized线程交替运行实现过程详解

    背景 用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26 而且是交替形式 线程1输出A--线程二输出1 线程1输出B--线程二输出2 线程1输出C--线程二输出3 以此类 ...

  9. arraylist线程安全吗_Java的线程安全、单例模式、JVM内存结构等知识梳理

    java技术总结 知其然,不知其所以然 !在技术的海洋里,遨游! 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本篇以一些问题开头,请先不看答案,自己思考一下,看一下你 ...

  10. java线程饥饿死锁_java并发-线程饥饿死锁测试

    线程饥饿死锁 <Java并发编程实践>中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题.在单线程的Executor中,若果一个任务将另 ...

最新文章

  1. .net连接mysql数据_.net连接MYSQL数据库 转载
  2. 【PP MRP】MRP参数详解
  3. Java面试准备:15个Java面试问题
  4. 索引的使用规则和设计考虑
  5. 为什么defineProperty不能检测到数组长度的“变化”
  6. vue隐藏和显示元素
  7. edwardcmh@cnblogs
  8. MyBatis映射表问题
  9. S3C2440看门狗定时器(Watchdog)
  10. 十大排序算法——快速排序法【挖坑法、左右指针法、前后指针法和优化方式三路快排】(C语言)
  11. Oracle从10g升级到11g详细步骤
  12. 数据走进宫崎骏的动画世界
  13. 新发的日常小实验——使用IETester测试不同IE版本的浏览器,测试网页JS的兼容性(console未定义兼容测试)
  14. Flutter 日期转换
  15. 机器人会偷走你的饭碗吗——写作篇
  16. python 收银系统_实现全栈收银系统(Node+Vue)(一)
  17. 3D电影、游戏里的角色是怎么制作的?
  18. 与虎谋皮,饮鸩止渴,却有什么办法呢?
  19. 基于微信小程序的疫情智慧社区管理系统 计算机毕业设计 后台管理系统
  20. JCR分区(WOS或Thomson Reuters或汤姆森 路透)和中科院分区(附网址及查询方法)...

热门文章

  1. PDF文件电子签名怎么做?分享一个好用的签名工具
  2. firefox新标签页背景_如何更改或自定义Firefox的“新标签页”
  3. 用Python爬虫爬取链家网上的房源信息
  4. 爬虫实战 链家房源爬取(BeautifulSoup) 详细分析 2020最新
  5. 爬虫——获取页面源代码
  6. android卡通头像,Face V(卡通头像制作)
  7. marked + mathjax 实现支持数学公式的 markdown 转 html
  8. 【柒穆雨】平面设计好不好学?设计小白该如何学习平面设计
  9. Pulsar的Proxy支持和SNI路由 - 修改...
  10. everedit选择_everedit选择_文本编辑器软件EverEdit怎么样?EverEdit相关功能介绍