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中别人是怎么实现的才能知道。
ScheduledThreadPoolExecutor之remove方法的更多相关文章
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Datatable删除行的Delete和Remove方法
在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(ind ...
- remove() 方法的兼容问题
一直以为jq的remove()方法是兼容的,今天才发现,原来ie的写法不一样,特作此记录. removeNode方法的功能是删除一个节点,语法为node.removeNode(false)或者node ...
- Python列表的remove方法的注意事项
为何没有删除列表中的全部元素? 解释: 按照执行顺序,第一个空格被删除之后,后面的元素会前移(变成['空格','空格','12','23']),指针下一次会指向新列表的第二个元素(即初始状态的第三个空 ...
- ArrayList调用remove方法需要注意的地方
ArrayList中有remove 方法和 removeAll方法, ArrayList中不仅继承了接口Collection中的remove方法,而且还扩展了remove方法. Collection中 ...
- Iterator的remove方法可保证从源集合中安全地删除对象(转)
如果对正在被迭代的集合进行结构上的改变(即对该集合使用add.remove或clear方法),那么迭代器就不再合法(并且在其后使用该迭代器将会有ConcurrentModificationExcept ...
- 如果是除去末尾特定字符或字符串:TrimEnd方法性能优于Remove方法
测试用例--除去末尾特定字符或字符串,Remove方法和TrimEnd方法的比较 结论: 如果是除去末尾特定字符或字符串:TrimEnd方法性能优于Remove方法 具体测试用例如下: Stopwat ...
- jquery 清空动态append添加元素,remove方法
<html> <head> <script type="text/javascript" src="jquery-1.9.1.js" ...
- List<T>的IndexOf方法和Remove方法
Microsoft地址 List<T>的IndexOf()方法 如果T是值类型的,就按照比较值的方法从列表的第一个元素开始逐个匹配,如果T是引用类型,就比较引用是否相同 举例如下: cla ...
随机推荐
- 前端每日实战:27# 视频演示如何用纯 CSS 创作一个精彩的彩虹 loading 特效
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vjvoow 可交互视频教程 此视频 ...
- PYTHON程序设计实验
Python程序设计实验报告一: 熟悉IDLE和在线编程平台 安徽工程大学 Python程序设计实验报告 班级 物流191 姓名 邹缕学号 3190505117成绩 ▁▁▁ 日期 2020.3.5 指 ...
- MacOS麦克风输入监听的方法
Windows上很多人都知道,然而实际上并没什么用——延迟太大,根本没法用. MacOS上有两种方法: QuickTime Player新建音频录制(不需要真的录音),如下图: 这个方法和Window ...
- 必备技能一、webpack
https://cloud.tencent.com/developer/section/1477376----->配置很重要 一.基本安装 mkdir webpack-demo &&am ...
- seo搜索优化技巧01-seo外链怎么发?
在seo搜索优化中,seo外链的作用并没有早期的作用大了.可是高质量的外链对关键词的排名还是很重要的.星辉信息科技对seo外链怎么发以及seo外链建设中的注意点进行阐述. SEO外链如何做 SEO高质 ...
- Linux环境下安装MySQL 5.7.28
先进入MySQL官网: www.mysql.com 去下载安装包 进入DOWNLOADS选项,点击MySQL Community (GPL) Downloads. 点击进入MySQL Communit ...
- 从零搭建Spring Cloud Gateway网关(一)
新建Spring Boot项目 怎么新建Spring Boot项目这里不再具体赘述,不会的可以翻看下之前的博客或者直接百度.这里直接贴出对应的pom文件. pom依赖如下: <?xml vers ...
- 在 macOS 下备份/还原/重置 LaunchPad 布局
原文链接:https://billc.io/2019/07/launchpad-layout-backup/ 前几天升级到 Catalina Public Beta 后,LauchPad 会出现无法刷 ...
- POI小demo
使用poi需要先下载相关jar包(http://download.csdn.net/detail/wangkunisok/9454545) poi-3.14-20160307.jar poi-ooxm ...
- [Linux][C][gcc][tips] 在头文件中定义变量引发的讨论
概述 本人的原创文章,最先发表在github-Dramalife-note中.转载请注明出处. Define variable(s) in header file referenced by mult ...