当一个线程需要等待另一个线程把某任务执行完成后它才能继续执行,此时可以使用FutureTask。

FutureTask执行多任务计算的使用场景 

FutureTask在高并发环境下确保任务只执行一次

 1 //代码转自http://blog.csdn.net/linchunquan/article/details/22382487
 2 class FutureTaskForMultiCompute {
 3 
 4     public static void main(String[] args) {
 5 
 6         FutureTaskForMultiCompute inst=new FutureTaskForMultiCompute();
 7         // 创建任务集合
 8         List<FutureTask<Integer>> taskList = new ArrayList<FutureTask<Integer>>();
 9         // 创建线程池
10         ExecutorService exec = Executors.newFixedThreadPool(5);
11         for (int i = 0; i < 10; i++) {
12             // 传入Callable对象创建FutureTask对象
13             FutureTask<Integer> ft = new FutureTask<Integer>(inst.new ComputeTask(i, ""+i));
14             taskList.add(ft);
15             // 提交给线程池执行任务,也可以通过exec.invokeAll(taskList)一次性提交所有任务;
16             exec.submit(ft);
17         }
18 
19         System.out.println(taskList.size());
20         System.out.println("所有计算任务提交完毕, 主线程接着干其他事情!");
21 
22         // 开始统计各计算线程计算结果
23         Integer totalResult = 0;
24         for (FutureTask<Integer> ft : taskList) {
25             try {
26                 //FutureTask的get方法会自动阻塞,直到获取计算结果为止
27                 totalResult = totalResult + ft.get();
28                 System.out.println("totalResult: " + totalResult);
29             } catch (InterruptedException e) {
30                 e.printStackTrace();
31             } catch (ExecutionException e) {
32                 e.printStackTrace();
33             }
34         }
35 
36         // 关闭线程池
37         exec.shutdown();
38         System.out.println("多任务计算后的总结果是:" + totalResult);
39 
40     }
41 
42     private class ComputeTask implements Callable<Integer> {
43 
44         private Integer result = 0;
45         private String taskName = "";
46 
47         public ComputeTask(Integer iniResult, String taskName){
48             result = iniResult;
49             this.taskName = taskName;
50             System.out.println("生成子线程计算任务: "+taskName);
51         }
52 
53         public String getTaskName(){
54             return this.taskName;
55         }
56 
57         @Override
58         public Integer call() throws Exception {
59             // TODO Auto-generated method stub
60 
61             for (int i = 1; i <= 100; i++) {
62                 result += i;
63             }
64             // 休眠5秒钟,观察主线程行为,预期的结果是主线程会继续执行,到要取得FutureTask的结果是等待直至完成。
65             Thread.sleep(5000);
66             System.out.println("子线程计算任务: "+taskName+" 执行完成! " + result);
67             return result;
68         }
69     }
70 }

 

posted on 2017-12-17 21:34  飞奔的菜鸟  阅读(670)  评论(0编辑  收藏  举报