[笔记][Java7并发编程实战手册]4.9-4.10在执行器中控制任务的完成和取消任务FutureTask
来源:互联网 发布:freenom域名怎么用 编辑:程序博客网 时间:2024/05/15 12:55
[笔记][Java7并发编程实战手册]系列目录
简介
在前面都是把需要执行的Runnable或则Callable提交给线程池,让线程池来管理任务的生命周期。在本章会学习:怎么取消任务的运行,在任务运行中,任务结束的时候怎么去处理一些事情,比如关闭资源,发送通知等。
本章心得
- 继承可取消任务的FutureTask,复写done() 方法。使用done方法来处理任务非正常结束和正常结束的一些操作
- 执行submit可接受一个Runnable任务,因此可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所以可将 FutureTask 提交给 Executor 执行。
FutureTask.cancel(true/false) 取消任务的特性:
- true 和 false 的区别
true : 在休眠中的线程被true取消,则休眠后面的代码不会继续执行,get获取结果将会抛出CancellationException异常
false: 在休眠中的线程被false取消,休眠后的代码会被继续执行,get获取结果同样会被抛出异常 - 取消正在正常运行的任务。比如task2中,一直while循环。则不会结束任务。所以只能用于周期性的任务取消。比较有明显的效果
- true 和 false 的区别
Future也可以被取消,只是没有检测任务完成处理的钩子方法
示例
控制任务的完成和取消
/** * Created by zhuqiang on 2015/9/1 0001. */public class sync4_7 { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService es = Executors.newCachedThreadPool(); ResultTask t1 = new ResultTask(new Task("小强")); es.submit(t1); ResultTask t2 = new ResultTask(new Task("小小强")); es.submit(t2);// ResultTask t3 = new ResultTask(new Task2("循环任务,测试任务在正常执行中,会不会被强制取消"));// es.submit(t3); TimeUnit.SECONDS.sleep(1); //主线程休眠1秒,然后取消t2任务 t2.cancel(true); // 演示1:观察被取消的任务在调用done() 方法中的打印信息,true 和 false 的区别是:true:在休眠中,将被强制取消,不会继续下面的代码,而false,当前任务会执行完,只是获取结果会爬出异常// t3.cancel(true); es.shutdown(); System.out.println("---------------- 获取任务结果"); System.out.println(t1.get()); System.out.println(t2.get()); //演示2:未正常完成的任务,调用获取结果会抛出异常CancellationException }}/** * 继承FutureTask, */class ResultTask extends FutureTask<String>{ public ResultTask(Callable<String> callable) { super(callable); } public ResultTask(Runnable runnable, String result) { super(runnable, result); } //当此任务转换到状态 isDone(不管是正常地还是通过取消)时该方法会被调用。 @Override protected void done() { System.out.println(Thread.currentThread().getName() + ",是否在正常完成前被取消:" + isCancelled()); }}class Task implements Callable<String>{ private String name; public Task(String name) { this.name = name; } @Override public String call() throws Exception { long time = (long)(Math.random()*10); System.out.printf("%s,%s,执行前,该任务将耗时:%s秒\n", Thread.currentThread().getName(), name, time); TimeUnit.SECONDS.sleep(time); //随机休眠,让外面能有时间执行取消任务的代码 System.out.printf("%s,%s,执行过了,耗时:%s秒\n", Thread.currentThread().getName(), name, time); return name; }}// 演示3 使用的类:正常的任务,不会被强制取消,只有线程等待获取中断会被取消class Task2 implements Callable<String> { private String name; public Task2(String name) { this.name = name; } @Override public String call() throws Exception { boolean flag = true; while (flag){ System.out.printf("%s,循环中\n",Thread.currentThread().getName()); TimeUnit.SECONDS.sleep(2); //演示3:正常的任务,不会被强制取消,只有线程等待获取中断会被取消 } return name; }}
某一次的运行结果:
pool-1-thread-1,小强,执行前,该任务将耗时:9秒pool-1-thread-2,小小强,执行前,该任务将耗时:3秒main,是否在正常完成前被取消:true---------------- 获取任务结果pool-1-thread-1,小强,执行过了,耗时:9秒Exception in thread "main" java.util.concurrent.CancellationExceptionpool-1-thread-1,是否在正常完成前被取消:false at java.util.concurrent.FutureTask.report(FutureTask.java:121)小强 at java.util.concurrent.FutureTask.get(FutureTask.java:192) at java7Concurrency.sync4_7.main(sync4_7.java:27) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
结果说明:
可以看到,t2在休眠中被取消了,后面的代码没有执行了。抛出的异常,是获取已经取消的任务抛出的异常。
但是如果 t2.cancel(false); ,来取消t2.t2会把当前任务正常的执行完。只是获取结果任然抛出异常
0 0
- [笔记][Java7并发编程实战手册]4.9-4.10在执行器中控制任务的完成和取消任务FutureTask
- Java并发编程-20-在执行器中取消任务和控制任务的完成
- [笔记][Java7并发编程实战手册]4.11-4.12在执行器中分离任务的启动和结果的处理和处理在执行器中被拒绝的任务
- [笔记][Java7并发编程实战手册]4.7-4.8 在执行器中延迟执行或则周期执行任务ScheduledThreadPoolExecutor
- [笔记][Java7并发编程实战手册]4.4 在执行器中执行任务并返回结果Callable、Future
- 并发编程--在执行器中控制任务的完成
- [笔记][Java7并发编程实战手册]3.6 并发阶段任务的运行phaser
- [笔记][Java7并发编程实战手册]3.8 并发任务间的数据交换Exchanger
- 并发编程--在执行器中取消任务
- [笔记][Java7并发编程实战手册]3.7 并发阶段任务中的阶段切换phaser
- 《Java并发编程实战》 任务执行和取消关闭
- Java7并发编程--4.2、在执行器中执行任务并且返回结果
- Java7并发编程--4.4、在执行器中执行任务并且返回结果
- 《Java并发编程实战》学习笔记 任务执行和取消关闭
- [笔记][Java7并发编程实战手册]4.3 创建固定的线程执行器newFixedThreadPool线程池
- 在执行器中控制任务的完成
- [笔记][Java7并发编程实战手册]3.2 资源的并发访问控制Semaphore信号量
- [笔记][Java7并发编程实战手册]3.3 资源的多副本并发访问控制Semaphore
- 给python交互式命令行增加自动补全和命令历史
- 自学Java系列 笔记4 多线程 1
- 新手dp
- 自学Java系列 笔记4 多线程 2
- OC中多线程的使用、概念、创建方式、生命周期、使用注意等
- [笔记][Java7并发编程实战手册]4.9-4.10在执行器中控制任务的完成和取消任务FutureTask
- Poj 3210 Coins(推理)
- 自学Java系列 笔记4 线程安全
- mpstat
- android目录结构
- 文件操作
- Python 异常处理
- 自学Java系列 笔记5 Java学习之HashMap和Hashtable的区别
- html 杂