java多线程之FutureTask
来源:互联网 发布:yii2.0框架 商城源码 编辑:程序博客网 时间:2024/05/21 16:59
简介
我们在处理多线程任务时希望在任务被取消或者正常完成后做一些后期处理,例如释放系统资源,更新数据库状态等等。java多线程技术中为我们提供了这样一个类叫FutureTask,他可以帮助我们实现任务在done状态后可以做一些后期处理。
例子
import java.util.concurrent.Callable;import java.util.concurrent.TimeUnit;/** * 实现Callable接口,是一个可以获取返回值的任务 * @author liujun */public class ExecutableTask implements Callable<String> {private String name;public ExecutableTask(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String call() throws Exception {long duration = (long)(Math.random()*10);System.out.println("name:"+this.name+"-duration:"+duration);TimeUnit.SECONDS.sleep(duration);return "hello world,I'm "+name;}}
import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;/** * 自定义FutureTask,重写done方法 * 可以在任务处于done状态时关闭资源、输出日志信息、发送通知等 * 但是无法改变任务的结果值 * @author liujun */public class ResultTask extends FutureTask<String> {private String name;/**真正的任务*/private ExecutableTask task;public ResultTask(Callable<String> callable) {super(callable);this.task = (ExecutableTask) callable;this.name = this.task.getName();}//whether normally or via cancellation//在任务正常结束或者被取消时回调@Overrideprotected void done() {if (this.isCancelled()) {//任务被取消System.out.println(this.name+" has bean cancel");}else{//任务正常结束System.out.println(this.name+" has bean finished");}}}
import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class Main {public static void main(String[] args) {//线程池ExecutorService executor = Executors.newCachedThreadPool();//是一个RunnableResultTask[] resultTasks = new ResultTask[5];//执行5个任务for (int i = 0; i < 5; i++) {ExecutableTask task = new ExecutableTask("Task "+i);resultTasks[i] = new ResultTask(task);executor.submit(resultTasks[i]);}//暂停5秒钟后取消所有任务try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}for (int i = 0; i < 5; i++) {resultTasks[i].cancel(true);}//查询任务是否被取消for (int i = 0; i < 5; i++) {if (!resultTasks[i].isCancelled()) {try {System.out.println(""+resultTasks[i].get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}}//关闭线程池executor.shutdown();}}
结果
name:Task 0-duration:1name:Task 1-duration:8
name:Task 2-duration:7
name:Task 3-duration:9
name:Task 4-duration:6
Task 0 has bean finished
Task 1 has bean cancel
Task 2 has bean cancel
Task 3 has bean cancel
Task 4 has bean cancel
hello world,I'm Task 0
0 0
- java多线程之FutureTask
- java多线程(4)之FutureTask
- Java多线程之 Callable、Future和FutureTask
- 我之见--java 多线程FutureTask
- Java多线程之Callable、Future和FutureTask
- java多线程之Future和FutureTask
- Java多线程之CyclicBarrier、Future和FutureTask
- java 多线程之Future与FutureTask
- Java多线程之Callable、Future和FutureTask
- 【Java多线程】之十四:Java FutureTask Example Program
- JAVA---多线程之Callable与Future,FutureTask,及其简单应用
- java多线程编程之Callable、Future和FutureTask。
- 多线程之 Callable Future FutureTask
- Java多线程 Callable Future FutureTask
- 【Java多线程】-Callable,Future,FutureTask
- java中的多线程包---FutureTask
- Java线程之FutureTask
- java线程之FutureTask
- Android调试系列之dumpsys命令
- Struts2
- instancetype 和 id 的区别
- 获取视频封面,本地视频,网络视频都可以用
- Attempt to present VC whose view is not in the window hierarchy 解决
- java多线程之FutureTask
- Android源码解析之(十一)-->应用进程启动流程
- win7系统注册组件失败
- 初学python(对比java语言不同) 第五篇
- 安卓中序列化Serializable和Parcelable区别和使用,intent间传递
- bootstrap实现pause/play键切换
- Redis 快速入门
- OpenStack Heat software config and software deployment code anlysis
- Glide用在CircleImageView上每次进入第一次显示默认图片