实例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| import java.util.Random; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;
public class FutureDemo {
public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); // 线程池 Future<Integer> result = executor.submit(() -> { // Lambda System.out.println("result开始."); Random rand = new Random(); for (int i = 0; i < 10000; i++) { if (i % 2000 == 0) { System.out.println("result:" + i); } rand.nextInt(); } System.out.println("result进入等待."); Thread.sleep(5000); return rand.nextInt(); });
Future<Integer> result2 = executor.submit(() -> { System.out.println("result2开始."); Random rand = new Random(); for (int i = 0; i < 100000; i++) { if (i% 20000 == 0) { System.out.println("result2:" + i); } rand.nextInt(); } System.out.println("result2进入等待."); Thread.sleep(10000); return rand.nextInt(); });
System.out.println("主线程在执行任务"); // 执行其他的任务 for (int i = 0; i < 10; i++) { System.out.println(i); }
try { System.out.println("准备取结果1:"); System.out.println("运行结果1:" + result.get()); // Future.get() 同步方法 System.out.println("准备取结果2:"); System.out.println("运行结果2:" + result2.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }
System.out.println("所有任务执行完毕");
} }
/* Output: 主线程在执行任务 0 1 2 3 4 5 6 7 8 9 准备取结果1: result开始. result:0 result2开始. result2:0 result:2000 result:4000 result:6000 result:8000 result进入等待. result2:20000 result2:40000 result2:60000 result2:80000 result2进入等待. 运行结果1:585751556 准备取结果2: 运行结果2:1483075689 所有任务执行完毕 */
|
总结
从输出结果看,主线程先提交异步任务result和result2,但是异步任务Future尚未开始执行。等到主线程执行到需要Future.get()的时候,进入等待,此时异步的所有Future开始多线程执行,直至执行完毕,主程序的运行状态会持续,一定时间后停止。