java并发-(7)异步编程模型

FutureTask代表异步计算的结果。其实现了Future接口、Runnable接口,FutureTask可以提交给Executor执行。可以把需要长时间运行的任务包装为一个FutureTask,然后提交给Executor执行。此时程序可以继续执行剩余的逻辑,当需要这个长时间任务的运行结果时,调用FutureTask.get()来获取结果。这样可以将运行长时间的任务以异步的方式执行,只在需要其结果时进行获取,这样可以提高执行效率;

FutureTask

类结构

从一个demo入手

Callable接口实现一个运行长时间的任务

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
package com.luhc.concurrent.future;

import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

/**
* created by luhuancheng on 2018/10/9
*/
public class RealData implements Callable<String> {

private String para;

public RealData(String para) {
this.para = para;
}

@Override
public String call() throws Exception {
StringBuilder res = new StringBuilder();
for (int i = 0; i < 10; i++) {
res.append(para);
TimeUnit.MILLISECONDS.sleep(100);
}
return res.toString();
}
}

提交给Executor执行

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
package com.luhc.concurrent.future;

import java.util.concurrent.*;

/**
* created by luhuancheng on 2018/10/9
*/
public class FutureMain {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 包装为一个FutureTask
FutureTask<String> future = new FutureTask<>(new RealData("a"));

ExecutorService executor = Executors.newFixedThreadPool(1);
// 将FutureTask提交给Executor执行
executor.submit(future);

// 无需等待任务执行完毕,我们可以先进行其他工作
// do other process

System.out.println("请求完毕");

// 获取任务的执行结果,如果此时任务未运行完毕,将阻塞
System.out.println("数据 = " + future.get());

// 关闭线程池
executor.shutdown();
}
}