【转载】Callable、FutureTask中阻塞超时返回的坑点
2024-10-20 16:02:54
本文转载自: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功能类似)。
最新文章
- Runtime解决屏幕旋转问题
- LintCode Longest Common Substring
- 使用wex5得到的一些教训
- python基础05 缩进与选择
- Sumdiv 等比数列求和
- <;a href=&#39;?out=login&#39;>;是什么意思
- 由c#的值类型与引用类型说开去
- bash 变量使用技巧
- C# MySQL数据库的备份 还原 初始化
- GsonFormat 报错
- GTK+基本图元的绘制
- Spring整合JDBC及事务处理
- AngularJS中巧用ngModel的$asyncValidators属性写一个验证唯一性的Direcitve
- SVN的安装
- logmnr使用
- 2015-2016-1 学期《软件工程》学生名单-- PS:教材使用《构建之法》第二版 --邹欣著
- Sublime text —— 自定义Color theme
- jquery miniui 学习笔记
- 为非ajax请求绑定回调函数的方法
- cobbler配置要基于PXE 环境,cobbler是pxe环境的二次封装
热门文章
- 关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究
- ios上【点击select元素,输入框自动获得焦点的问题】
- The sixteenth day
- sass文件转css时注释虽然支持中文,但是出现乱码的解决方法
- Android自定义控件练手——波浪效果
- Swagger2:常用注解说明
- 初学React:定义一个组件
- CRM WebUI and Hybris的Product页面标题实现
- 816 Ambiguous Coordinates (many cases problem)
- E. New Reform_贪心,深搜,广搜。