FutureTask的cancel方法真的能停止掉一个正在执行的异步任务吗
2015-12-30 14:25
399 查看
ExecutorService executor = Executors.newSingleThreadExecutor();FutureTask<?> futureTask = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {for(int i=0;i<10000;i++){System.out.println(i);}return null;}});executor.execute(futureTask);System.out.println("futureTask start");try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}futureTask.cancel(true);System.out.println("futureTask cancel");}我们先来看看这个例子,发现最终执行结果是9999,即异步任务并没有被cancel而是一直执行完毕,这样看来这个cancel方法有点名不副实啊。其实我们如果查看FutureTask的源码就会发现cancel只不过是调用了Thread的interrupt方法,而interrupt只能是停掉线程中有sleep,wait,join逻辑的线程,抛出一个InterruptException。这样看来FutureTask的cancel方法并不能停掉一切正在执行的异步任务。但是这里我们有一个妥协的做法就是在判断条件中加!Thread.currentThread().isInterrupted()这个判断即可
ExecutorService executor = Executors.newSingleThreadExecutor();FutureTask<?> futureTask = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {for(int i=0;i<10000&&!Thread.currentThread().isInterrupted();i++){System.out.println(i);}return null;}});executor.execute(futureTask);System.out.println("futureTask start");try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}futureTask.cancel(true);System.out.println("futureTask cancel");最终这个就可以真正的结束异步任务。到这里我们可以发现Java中并没有可以真正中断线程的方法,早期的stop已经不推荐使用,而interrupt方法也需要代码片段中有sleep,wait,join这些方法的调用,否则不能停止线程,现在java推荐的方式就是将run方法执行完,这就需要我们在while循环中加一个标志来控制退出,不过我们不需要额外设置这个标志,只需要调用thread的isInterrupted()方法判断,这样外界就可以调用该线程的isInterrupted方法来停止现在了,不用额外添加标志。
相关文章推荐
- Java设计模式_行为型_备忘录模式_大话西游之月光宝盒
- swing嵌入ocx或dll影像控件
- Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份
- java 学习之路
- linux进程管理
- 改变mysql 数据表编码
- curl
- CI框架整合smarty模板
- CSS让DIV按照背景图片的比例缩放,并让背景图片填充整个DIV
- 软件设计
- MapReduce和YARN是什么关系?
- JS中的事件冒泡——总结
- 饭卡管理系统学生E-R图
- 【OMNet++】tictoc示例三
- present到带有导航栏的viewController,导航栏会消失的问题
- 关于.html()、.val()、.text()区别,IE6中会出现问题
- HTML5本地存储——IndexedDB(一:基本使用)
- windows安装zabbix_agent
- Linux 下不同目录下文件生成动态库.so
- 常用算法回顾——冒泡排序