Callable、FutureTask中阻塞超时返回的坑点
来源:互联网 发布:呱呱漫画软件 编辑:程序博客网 时间:2024/06/05 16:13
本文转载自:http://www.cnblogs.com/starcrm/p/5010863.html
案例1:
package com.net.thread.future;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask;import java.util.concurrent.TimeUnit; /** * @author * @Time:2017年8月18日 上午10:49:07 * @version 1.0 * @description */ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class FutureTaskExample { public static void main(String[] args) { MyCallable callable1 = new MyCallable(1000); MyCallable callable2 = new MyCallable(5000); FutureTask<String> futureTask1 = new FutureTask<String>(callable1); FutureTask<String> futureTask2 = new FutureTask<String>(callable2); ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(futureTask1); executor.execute(futureTask2); while (true) { try { if(futureTask1.isDone() && futureTask2.isDone()){ System.out.println("Done"); //shut down executor service executor.shutdown(); return; } if(!futureTask1.isDone()){ //阻塞futureTask1 System.out.println("FutureTask1 output="+futureTask1.get()); } if(!futureTask2.isDone()){ //阻塞futureTask2 System.out.println("FutureTask2 output="+futureTask2.get(1000,TimeUnit.MILLISECONDS)); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }catch(Exception e){ //do nothing } } } static class MyCallable implements Callable<String> { private long waitTime; public MyCallable(int timeInMillis){ this.waitTime=timeInMillis; } @Override public String call() throws Exception { Thread.sleep(waitTime); return Thread.currentThread().getName(); } } }
运行结果很简单,必须是:
FutureTask1 output=pool-1-thread-1
FutureTask2 output=pool-1-thread-2
Done
案例2:
package com.net.thread.future;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask;import java.util.concurrent.TimeUnit; /** * @author * @Time:2017年8月18日 上午10:49:07 * @version 1.0 * @description */public class FutureTaskExample2 { public static void main(String[] args) { MyCallable callable1 = new MyCallable(1000); MyCallable callable2 = new MyCallable(5000); FutureTask<String> futureTask1 = new FutureTask<String>(callable1); FutureTask<String> futureTask2 = new FutureTask<String>(callable2); ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(futureTask1); executor.execute(futureTask2); while (true) { try { if(futureTask1.isDone() && futureTask2.isDone()){ System.out.println("Done"); //shut down executor service executor.shutdown(); return; } if(!futureTask1.isDone()){ //阻塞futureTask1 System.out.println("FutureTask1 output="+futureTask1.get()); } System.out.println("Waiting for FutureTask2 to complete"); String s = futureTask2.get(1000, TimeUnit.MILLISECONDS); //阻塞500毫秒 if(s !=null){ System.out.println("FutureTask2 output="+s); } else{ System.out.println("FutureTask2 output is null"); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }catch(Exception e){ //do nothing } } } static class MyCallable implements Callable<String> { private long waitTime; public MyCallable(int timeInMillis){ this.waitTime=timeInMillis; } @Override public String call() throws Exception { Thread.sleep(waitTime); return Thread.currentThread().getName(); } } }
运行结果:
FutureTask1 output=pool-1-thread-1
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
FutureTask2 output=pool-1-thread-2
Done
说明:
1、get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
2、get(long timeout, TimeUnit unit)用来获取执行结果,如果超过指定时间,直接结束执行下面的代码;如果是在循环中,则跳出本次循环进行下一次轮训(continue功能类似)。
阅读全文
0 0
- Callable、FutureTask中阻塞超时返回的坑点
- (原创)Callable、FutureTask中阻塞超时返回的坑点
- 有返回值的多线程的实现:FutureTask+Callable
- Callable 与 FutureTask:有返回值的多线程
- JAVA 笔记 Callable 与 FutureTask:有返回值的多线程
- 带返回值的线程:Callable、Future和FutureTask
- 使用FutureTask和Callable创建可获取返回值的多线程
- Callable、Future接口实现原理,FutureTask 原理解析,获取线程的返回值
- Future和Callable、FutureTask实现,带有返回值的线程请求
- java中callable和futuretask使用
- Future,FutureTask,Callable,Runnable的用法
- Java 的Callable、Future和FutureTask
- Java的Runnable、Callable、Future、FutureTask。
- Callable和Future、FutureTask的使用
- Callable和Future、FutureTask的使用
- Callable和Future、FutureTask的使用
- Runnable、Callable、Future和FutureTask的说明
- Java并发编程:Callable、Future和FutureTask 获取返回值
- 【转载+补充】嵌入式内存泄露处理方法
- 西电渣硕面试经历
- AJAX异步提交form表单
- Json的序列化与反序列化
- 使用移动数组下标的方式实现增删改查
- Callable、FutureTask中阻塞超时返回的坑点
- 知乎上对理解阻塞非阻塞与同步异步的有趣解释
- 向量外积的应用
- 类与对象(1)
- Tomcat 源码阅读(五)解析请求ProtocolHandler
- 将<select>被选中项的值通过<a>链接的参数形式传递给后台的实现方法
- python编译过程和执行原理
- mybatis学习之路----动态sql之if条件判断各种使用方式
- 多线程之ReadWriteLock模拟缓存(九)