学习 FutureTask
来源:互联网 发布:淘宝真丝客服沟通技巧 编辑:程序博客网 时间:2024/05/19 16:37
先转载一篇讲解FutureTask的博客:
深入学习FutureTask
public class TestTask implements Callable<String> { private String name; public TestTask(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String call() throws Exception { System.out.println(name + " TestTask is running"); return "TestTask"; }}
测试1:
如果task线程任务还未执行,调用cancel(false),线程任务不会被执行。
public static void main(String[] args){ final ExecutorService executor = Executors.newCachedThreadPool(); TestTask task = new TestTask("zeng"); final FutureTask<String> futureTask = new FutureTask<String>(task); //确保取消操作在线程执行之前操作 Timer timer=new Timer();//实例化Timer类 timer.schedule(new TimerTask(){ public void run(){ executor.submit(futureTask); System.out.println(futureTask.isDone()); } },1000); futureTask.cancel(false);// futureTask.cancel(true); }
测试结果:无法打印is running,isDone结果为true
源码中将状态值按照从小到大排序,最终态也按照相同类型统一分布,这个思路很棒,有些地方可以借鉴下
private static final int NEW = 0; private static final int COMPLETING = 1; private static final int NORMAL = 2; private static final int EXCEPTIONAL = 3; private static final int CANCELLED = 4; private static final int INTERRUPTING = 5; private static final int INTERRUPTED = 6;
public boolean isCancelled() { return state >= CANCELLED; } public boolean isDone() { return state != NEW; }
测试2:线程任务执行过程中,执行cancel(false)
public String call() throws Exception { System.out.println(name + " TestTask is running"); for(int i=0;i<1000;i++){ System.out.println("task run times:" + i); } return "TestTask"; }
public static void main(String[] args){ final ExecutorService executor = Executors.newCachedThreadPool(); TestTask task = new TestTask("zeng"); final FutureTask<String> futureTask = new FutureTask<String>(task); executor.submit(futureTask); System.out.println("prepare to cancel"); futureTask.cancel(false); //执行完cancel,把线程让出来,看子线程会不会继续执行 Thread.yield(); System.out.println(futureTask.isCancelled()); System.out.println(futureTask.isDone()); return; }
测试结果:在子任务执行过程中,执行cancel(false),状态会变,但是子任务不会停止
prepare to cancel
zeng TestTask is running
true
task run times:0
true
task run times:1
task run times:2
task run times:3
task run times:4
task run times:5
task run times:6
测试3:线程任务执行结束,执行cancel(false)
public String call() throws Exception { System.out.println(name + " TestTask is running"); return "TestTask"; }
public static void main(String[] args){ final ExecutorService executor = Executors.newCachedThreadPool(); TestTask task = new TestTask("zeng"); final FutureTask<String> futureTask = new FutureTask<String>(task); executor.submit(futureTask); try { Thread.sleep(500); System.out.println("prepare to cancel"); futureTask.cancel(false); System.out.println(futureTask.isCancelled()); System.out.println(futureTask.isDone()); } catch (InterruptedException e) { e.printStackTrace(); } }
测试结果:当任务结束时取消,状态并不会改变,也就是说不会取消任务
zeng TestTask is running
prepare to cancel
false
true
阅读全文
0 0
- 学习FutureTask
- 学习 FutureTask
- FutureTask源码学习
- FutureTask深入学习
- 深入学习 FutureTask
- 深入学习 FutureTask
- Android Callable Future FutureTask学习
- FutureTask
- FutureTask
- FutureTask
- FutureTask
- FutureTask
- FutureTask
- FutureTask
- FutureTask
- Future,FutureTask,Executors,ExecutorService,Callable学习笔记
- 疯狂Java学习笔记(66)-----------Callable、Future和FutureTask
- java 中间件学习4-CountDownLatch、CyclicBarrier、Future和FutureTask
- JS Array(数组)本地面向对象总结和运用
- 2018考研英语暑期怎么复习?老师只建议你大量阅读
- tomcat 与 weblogic 区别
- 《学习opencv》第四章第三题(全)
- 简易散列表实现电话号码查询系统
- 学习 FutureTask
- spring中lazy-init详解
- c/c++基本输入输出学习总结
- Minimum Path Sum最小路径和算法详解
- Java-数据类型及转换
- JDBC连接数据库
- Yii2 Class not found、命名空间、找不到类的解决办法
- maven 中 配置阿里云的maven仓库
- 2017考研复试选导师,最该权衡的7个方面