JavaFuture实例

实例代码

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开始多线程执行,直至执行完毕,主程序的运行状态会持续,一定时间后停止。