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 }