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 ...
随机推荐
- .Net 特性分析与妙用
一.特性是什么 1.想象很多小伙伴们都看过在一个类上方.或者在控制器见过类似的东东,加上之后就可以标识这个类或者方法就具备了某些特点 ,那我们就进入它的内心一探究竟吧. 2.我们进入某个特性之后,可以 ...
- Yuchuan_Linux_C编程之六 Makefile项目管理
一.整体大纲 二.makefile的编写 一个规则 两个函数 三个变量 1. 一个规则 三要素:目标, 依赖, 命令 目标:依赖 命令: 第一条规则是用来生成终 ...
- fork他人仓库文件及修改整合
1.首先使用浏览器打开自己的GitHub地址,并打开即将fork的文件地址(别人的文件地址),在其右上方找到fork选项并点击即可 2.在自己的电脑上创建一个文件夹后使用git bush here的C ...
- Vuex的理解以及它的辅助函数
理解:vue中的“单向数据流”,这里借用官网的图示: Vue是单向数据流,v-model只是语法糖而已.单向数据流就是:数据总是[向下传递]从父级组件传递给子组件,只能单向绑定.子组件内部不能直接修改 ...
- 单片机基础——使用GPIO输出点亮一个LED灯
1. 准备工作 硬件准备 开发板首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接. 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码,可参考MDK安装教程 ...
- 安装部署hyperledger fabric1.0
安装环境 CentOS7 1.安装Docker Docker Hub在国外,安装会较慢,可用国内镜像DaoCloud.可执行以下命令安装Docker. sudo yum install -y yum- ...
- 开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?
起因 - 又是一封邮件 2020 年 3 月 2 日,收到了一封邮件,对,这次故事的起因又是一封邮件,和上次写个bug被国家信息安全漏洞共享平台抓到了一样. 这是一条评论通知邮件,一开始我以为只是正常 ...
- unittest测试框架详解
单元测试的定义 1. 什么是单元测试? 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类,一般是开发来做的,按照测试 ...
- HashMap底层源码剖析
HashMap底层源码剖析 一.HashMap底层用到的数据结构 数组+单向链表+红黑树 数组:数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:当法神hash碰撞时,首先会找到数组对应位 ...
- (转)协议森林02 小喇叭开始广播 (以太网与WiFi协议)
协议森林02 小喇叭开始广播 (以太网与WiFi协议) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们在邮差与邮局中说到,以 ...