Future 接口是 JDK1.5 开始提供。它的作用是异步获取线程计算的结果。
看一个等待、获取任务执行结果的例子:
package constxiong.interview;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 测试 Future
* @author ConstXiong
* @date 2020-01-02 16:49:03
*/
public class TestFuture {
private static ExecutorService executor = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws InterruptedException, ExecutionException {
//去除 Helle 2020 空格,判断任务执行状态,输出等待信息
Future<String> future = removeBlank("Helle 2020");
while (!future.isDone()) {
Thread.sleep(1000L);
System.out.println("等待1秒");
}
System.out.println(future.get());
executor.shutdown();
}
/**
* 移除字符串中的空白符号
* @param str
* @return
*/
private static Future<String> removeBlank(String str) {
return executor.submit(() -> {
Thread.sleep(3000L);
return str.replace(" ", "");
});
}
}
可以看出 Future 接口里的 isDone() 方法可以判断任务是否已经执行完成,get() 方法可以获取到任务的执行结果
Future 接口包含 5 个方法如下:
boolean cancel(boolean mayInterruptIfRunning);//取消任务
boolean isCancelled();//判断任务是否已取消
boolean isDone();//判断任务是否已结束
get();//获得任务执行结果
get(long timeout, TimeUnit unit);//获得任务执行结果,支持超时
Future 对象是由 ExecutorService 接口的 3 个提交任务的方法返回
Future<?> submit(Runnable task);//提交 Runnable 任务
<T> Future<T> submit(Callable<T> task);//提交 Callable 任务
<T> Future<T> submit(Runnable task, T result);//提交 Runnable 任务及结果引用,result 用于主线程和任务执行线程间通信
第 3 个接口通过 T result 可以在主线程和任务执行线程间进行通信
例子如下:
package constxiong.interview;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 测试 Future
* @author ConstXiong
* @date 2020-01-02 16:49:03
*/
public class TestFuture {
private static ExecutorService executor = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws Exception {
testGetReplaceBlankWithResult();
}
private static void testGetReplaceBlankWithResult() throws Exception {
//用 Result 对象里的 str 字符串替换 Helle 2020 中的空格
Result r = new Result(" ConstXiong ");
Future<String> future = replaceBlank("Helle 2020", r);
System.out.println(future.get());
System.out.println(r.getStr());
executor.shutdown();
}
/**
* 根据 Result 对象的 str 属性替换目标字符串中的空格,并且修改 Result 对象的 str
* @param str
* @return
*/
private static Future<String> replaceBlank(String str, Result result) {
return executor.submit(() -> {
Thread.sleep(3000L);
String newStr = str.replace(" ", result.getStr());
result.setStr("大俊子");
return newStr;
});
}
}
class Result {
private String str;
public Result(String str) {
this.str = str;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
ConstXiong 备案号:苏ICP备16009629号-3