zoukankan      html  css  js  c++  java
  • ScheduledThreadPoolExecutor之remove方法

    之前用定时任务的线程池,设置了个任务,但是突然今天产品说,某些个操作需要中断某些任务(如果任务还没有执行),使其不能再到点执行了。于是查了API果然有这样一个方法。

    一看API,需要移除的是一个Runnable对象,想当然的就把任务调度的传入的Runable对象保留下来,然后进行删除。简要代码如下

    Runnable:
        static class Task implements Runnable {
    
            @Override
            public void run() {
                System.out.println(Instant.now().getEpochSecond());
            }
        }
        public static void main(String[] args) {
            ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(10);
            Task task = new Task();
            scheduledThreadPoolExecutor.schedule(task, 10, TimeUnit.SECONDS);
            scheduledThreadPoolExecutor.remove(task);
            System.out.println(Instant.now().getEpochSecond());
        }

    一执行,完蛋10s过后任务还是执行了,任务并没有移除

    看了下ScheduledThreadPoolExecutor中重写的remove方法是去他自己的BlockingQueue里面删除了一个任务,也就是这个方法ScheduledThreadPoolExecutor.DelayedWorkQueue#remove,这个的入参变成了Object,而且一看这个queue队列里面装的是RunnableScheduledFuture这个对象,这家伙肯定是实现了Runnable接口的,一看果然是,那么这个东西放到队列去的呢?

    再看schedule方法是返回了一个值的,猜想了下是不是封装过我们传入的Runbale对象,于是决定remove方法的返回值,结果一看返回的ScheduledFuture对象没有实现Runnable接口,而remove要的Runnable。有一点点坑的地方来了,RunnableScheduledFuture这个是

    ScheduledFuture这个的子类,面向接口编程嘛,最后是返回了一个父类接口,但是父类接口没有实现Runnable,子类才实现了。

    最后再看ScheduledThreadPoolExecutor#delayedExecute这个方法里面刚好把刚才的那个RunnableScheduledFuture对象传入进去了并且加入到队列中去了。这样就和前面联系起来了

     

    如此一来 我们只需要把schedule方法的返回值强转成子类对象RunnableScheduledFuture,保存下来,然后再去调用remove应该可以成功的移除了

        public static void main(String[] args) {
            ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(10);
            Task task = new Task();
            RunnableScheduledFuture<?> schedule =
                    (RunnableScheduledFuture<?>) scheduledThreadPoolExecutor.schedule(task, 10, TimeUnit.SECONDS);
            scheduledThreadPoolExecutor.remove(schedule);
            System.out.println(Instant.now().getEpochSecond());
    
    
        }

    虽然有API供参考,但是就像前面只看API的时候,那个Runnable参数到底该什么,还得要去看下ScheduledThreadPoolExecutor中别人是怎么实现的才能知道。

  • 相关阅读:
    pyqt笔记1模块 信号和插槽
    pyqt5 eric6 pyqt5-tools
    转入Python3.5
    ARM伪指令
    ARM MOV PC加8
    所有JTAG集成电路都应该支持菊花链
    冯诺依曼存储子系统的改进
    [分享]Active-HDL 9.2 安装
    运行python脚本后台执行
    scala实验 模拟图形绘制
  • 原文地址:https://www.cnblogs.com/nijunyang/p/12657039.html
Copyright © 2011-2022 走看看