异步获取线程计算的结果-Future
16lz
2021-01-22
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;
}
}
更多相关文章
- Redis为什么又引入了多线程?作者也逃不过“真香定理”?
- 详解第三种创建线程的方式-Callable接口
- java线程相关面试题(第一版)
- Java线程之线程的调度-让步
- 【编测编学】接口测试面试题必背(下)
- java中的几个线程池的使用
- (不谈废话,只有干货)解决线程间协作问题的工具类Exchanger详解
- 一文看懂 Node.js 中的多线程和多进程[每日前端夜话0x107]