java多线程获取返回结果--Callable和Future示例

 1 package test.guyezhai.thread;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Date;
 5 import java.util.List;
 6 import java.util.concurrent.Callable;
 7 import java.util.concurrent.ExecutionException;
 8 import java.util.concurrent.ExecutorService;
 9 import java.util.concurrent.Executors;
10 import java.util.concurrent.Future;
11 
12 @SuppressWarnings("unchecked")
13 public class TestThread {
14 
15     @SuppressWarnings("rawtypes")
16     public static void main(String[] args) throws ExecutionException, InterruptedException {
17         System.out.println("----程序开始运行----");
18         Date date1 = new Date();
19 
20         int taskSize = 50000;
21         // 创建一个线程池
22         ExecutorService pool = Executors.newFixedThreadPool(taskSize);
23         // 创建多个有返回值的任务
24         List<Future> list = new ArrayList<Future>();
25         for (int i = 0; i < taskSize; i++) {
26             Callable c = new MyCallable(i + " ");
27             // 执行任务并获取Future对象
28             Future f = pool.submit(c);
29             // System.out.println(">>>" + f.get().toString());
30             list.add(f);
31         }
32         // 关闭线程池
33         pool.shutdown();
34 
35         // 获取所有并发任务的运行结果
36         for (Future f : list) {
37             // 从Future对象上获取任务的返回值,并输出到控制台
38             System.out.println(">>>" + f.get().toString());
39         }
40 
41         Date date2 = new Date();
42         System.out.println("----程序结束运行----,程序运行时间【" + (date2.getTime() - date1.getTime()) + "毫秒】");
43     }
44 }
45 
46 class MyCallable implements Callable<Object> {
47     private String taskNum;
48 
49     MyCallable(String taskNum) {
50         this.taskNum = taskNum;
51     }
52 
53     @Override
54     public Object call() throws Exception {
55         System.out.println(">>>" + taskNum + "任务启动");
56         Date dateTmp1 = new Date();
57         Thread.sleep(1000);
58         Date dateTmp2 = new Date();
59         long time = dateTmp2.getTime() - dateTmp1.getTime();
60         System.out.println(">>>" + taskNum + "任务终止");
61         return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
62     }
63 }
原文地址:https://www.cnblogs.com/guyezhai/p/5776357.html