本文转载自: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功能类似)。

最新文章

  1. Runtime解决屏幕旋转问题
  2. LintCode Longest Common Substring
  3. 使用wex5得到的一些教训
  4. python基础05 缩进与选择
  5. Sumdiv 等比数列求和
  6. &lt;a href=&#39;?out=login&#39;&gt;是什么意思
  7. 由c#的值类型与引用类型说开去
  8. bash 变量使用技巧
  9. C# MySQL数据库的备份 还原 初始化
  10. GsonFormat 报错
  11. GTK+基本图元的绘制
  12. Spring整合JDBC及事务处理
  13. AngularJS中巧用ngModel的$asyncValidators属性写一个验证唯一性的Direcitve
  14. SVN的安装
  15. logmnr使用
  16. 2015-2016-1 学期《软件工程》学生名单-- PS:教材使用《构建之法》第二版 --邹欣著
  17. Sublime text —— 自定义Color theme
  18. jquery miniui 学习笔记
  19. 为非ajax请求绑定回调函数的方法
  20. cobbler配置要基于PXE 环境,cobbler是pxe环境的二次封装

热门文章

  1. 关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究
  2. ios上【点击select元素,输入框自动获得焦点的问题】
  3. The sixteenth day
  4. sass文件转css时注释虽然支持中文,但是出现乱码的解决方法
  5. Android自定义控件练手——波浪效果
  6. Swagger2:常用注解说明
  7. 初学React:定义一个组件
  8. CRM WebUI and Hybris的Product页面标题实现
  9. 816 Ambiguous Coordinates (many cases problem)
  10. E. New Reform_贪心,深搜,广搜。