FutureTask的cancel方法真的能停止掉一个正在执行的异步任务吗
来源:互联网 发布:minitool数据恢复软件 编辑:程序博客网 时间:2024/05/16 00:50
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方法来停止现在了,不用额外添加标志。
1 0
- FutureTask的cancel方法真的能停止掉一个正在执行的异步任务吗
- AsyncTask的cancel方法并没有停止任务
- 停止正在执行的JOB的方法
- 详解AsyncTask的cancel的有效用法,强制停止AsyncTask异步任务
- 停止正在执行的线程
- 强制停止客户端正在执行的SQL
- Oracle数据库,停止正在执行的package
- [随笔] 停止mysql正在执行的sql
- java系统中使用调度器Quartz实现对正在执行任务的停止
- FutureTask.cancel(true)与interrupt()的效果一样
- Quartz-中断正在执行的任务
- quartz 获取正在执行的任务
- 线程基本操作 ACE_Thread::cancel (threadHandle)可停止线程的执行(在windows下不起作用)
- 如何停止php正在执行的后台代码
- java 关闭一个正在执行的线程
- java 关闭一个正在执行的线程
- ORACLE如何停止一个正在运行的JOB
- 如何停止一个正在运行的java线程
- CEdit控件清空内容
- 性能测试流程剖析
- 从今天开始,无所畏惧!
- JAVA序列化与反序列化基础 Serializable
- xcode 添加空模板
- FutureTask的cancel方法真的能停止掉一个正在执行的异步任务吗
- 仿联系人界面右侧索引栏
- 《Swift NSDictionary 的详细使用和部分方法介绍 和 哈希表(散列)的阐述和解释 》
- linux学习考试复习笔记
- linux恢复误删除文件-ext3grep
- Jqgrid入门-显示基本的表格
- 福利 | 据说,每一个 iOSer 都想要一张 Swift 大会门票
- Activity launchMode详解
- iOS点击手势(tap)