Java可自定义中断定时器的实现

作者: OneFish | 来源:发表于2016-06-22 10:27 被阅读808次

Java定时器的实现一般使用的是Timer和ScheduledExecutorService

  • 使用Timer的时候需要自定义一个task继承TimerTask,在task中封装业务逻辑
    然后再使用Timer.scheduleAtFixedRate 按照固定速率执行task中的逻辑

本文介绍的是ScheduledExecutorService来实现可中断定时器
我们首先看一下scheduleAtFixedRate 的javaDoc

  • If any execution of the task encounters an exception, subsequent executions are suppressed.Otherwise, the task will only terminate via cancellation or termination of the executor.

通过javaDoc可以发现需要终止task的方法有三种:

  1. 执行shutdown(),但是这个会终止整个Executor
  2. task抛出异常,在task执行到需要中断的时候,抛出异常
  3. 取消当前执行的task

执行shutdown()肯定是不合适的,通过主动抛异常的方式来中断也不好
所以使用取消当前task的方式来实现自定义中断

  1. 首先看一下scheduleAtFixedRate的源码,我们注意到这个方法返回的是ScheduledFuture<?>
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

ScheduledFuture是继承了Future的

public interface ScheduledFuture<V> extends Delayed, Future<V>

这样就可以通过Future.cancel()的方式来取消当前task实现自定义中断

  1. 初始化ScheduledExecutorService 线程池
private ScheduledExecutorService service = Executors.newScheduledThreadPool(20,new NamedThreadFactory("Schedule-Task"));
  1. 实现业务逻辑和退出条件
    实现思路是通过保存每个task的Future对象,在满足条件是,执行future.cancel()
// 当前正在执行的task合集 
private Map<String,Future> futures = new HashMap<>();
// 执行定时任务的时间间隔
private int period = 5;
private String taskPrefix ="DoSomething-Task";
public void executeTask(String id) {

    // 已有当前定时任务在执行时,删掉当前任务,然后重新启动
    if (futures.containsKey(taskPrefix+id)) {
        futures.get(taskPrefix+id).cancel(true);
        futures.remove(taskPrefix+id);
    }
    Future future = service.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            int currentNum = cacheService.getCurrentShowNum(id);
            // 满足中断task条件
            if ( /* 条件逻辑 */) {
                Future currentFuture = futures.get(taskPrefix+id);
                currentFuture.cancel(true);
                // 任务执行完成
                futures.remove(taskPrefix+id);
            } else {
                // 执行task业务逻辑
            }
        }
    },0,period, TimeUnit.MINUTES);
    futures.put(taskPrefix+id,future);
}

相关文章

  • Java可自定义中断定时器的实现

    Java定时器的实现一般使用的是Timer和ScheduledExecutorService 使用Timer的时候...

  • Linux C/C++定时器的实现原理和使用方法

    定时器的实现原理 定时器的实现依赖的是CPU时钟中断,时钟中断的精度就决定定时器精度的极限。一个时钟中断源如何实现...

  • java定时器

    java定时器 什么是Java定时器?Java 定时器就是在给定的间隔时间执行自己的任务; Java实现定时器有以...

  • 2017.12.21学习总结

    下午学习了定时器,定时器分为高级定时器、通用定时器和基本定时器,我们主要研究通用定时器。 定时器中断实现步骤:...

  • OneActionBar-通用标题头ActionBar封装

    OneActionBar 使用说明 简介 自定义ActionBar,支持属性,java代码方式配置,可实现标题,标...

  • 【IOS】自定义View添加NSTimer导致不释放的问题

    我们经常需要在自定义视图中添加动画.很多动画都需要用定时器实现.但是如果我们在自定义view中添加定时器,如果不手...

  • 命题-十三章-简答

    一个定时器的定时时间有限,如何用两个定时器的串行定时来实现较长时间的定时? 【解析】 方法1,在第一个定时器的中断...

  • JAVA实现定时任务的几种方式

    JAVA实现定时任务的几种方式 @(JAVA)[spring|quartz|定时器]近期项目开发中需要动态的添加定...

  • 给8051提供时间

    时间是利用定时器0中断的解决,我们设置定时器0,每个 1 毫秒中断一次,用一个变量,每次中断的时候增加 1,这样子...

  • 第11章 定时器和时间管理

    系统定时器是一种可编程硬件芯片,能以固定频率产生中断,也就是定时器中断,其对应的中断处理程序负责更新系统时间,也负...

网友评论

  • KEEN0224:我是初学者,这些虽没看懂,但是支持你。
    OneFish:@WUYING 加油↖(^ω^)↗

本文标题:Java可自定义中断定时器的实现

本文链接:https://www.haomeiwen.com/subject/mvugdttx.html