1、JDK 从什么时候开始支持Future 模式
jdk 1.5 开始支持Future设计模式
2、为什么有Future设计模式
jdk 中开启一个线程 1.5 之前 主要两种方式:
一种直接继承 Thread 类,另一种实现 Runnable 接口,实现接口的方式最终还是要交给一个线程来执行。
这两种方式都有一个缺陷:执行完任务之后,无法获取执行结果。
从 java 1.5 开始,就提供了 Callable和Future, 通过他们可以在任务执行完毕之后获取到任务的执行结果。
3、Future模式核心思想
Future模式的思想就是 让主线程原来需要同步等待的时间用来做其他事情,需要结果的时候,再去获取异步执行的结果。
4、Future相关类图
1.png
注意:RunnableFuture java 1.6 才出现,所有 导致 1.5就有的FutureTask 实现上与上一个版本有差别。
5、使用示例
Callable 只是实现了获取执行结果的功能,并没有达到异步执行的效果
public class CallableClient {
private final static ExecutorService executorService = Executors.newSingleThreadExecutor();
public static void main(String[] args) {
CalculateCallable callable = new CalculateCallable();
Future<String> future = executorService.submit(callable);
try {
String result = future.get();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Main thread is over");
}
}
class CalculateCallable implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(10000);
return "Hello World";
}
}
FutureTask 真正实现了异步线程执行的效果。
public class FutureTaskClient {
private static final ExecutorService service = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws Exception {
FutureTask<String> task = new FutureTask<>(() -> "Hello World");
service.submit(task);
System.out.println("主线程执行其他任务中");
Thread.sleep(3000);
String result = task.get();
while (true) {
if (result != null) {
System.out.println(result);
break;
}
}
System.out.println("获取执行结果完毕");
}
}
结果输出:
主线程执行其他任务中
Hello World
获取执行结果完毕
OK , 使用方式 分析完毕,后面可能会有 一些源码的分析,期待吧~~~