提到这个Future,相信英文好的人都知道,这个单词的意思是表示未来,今天的用法也跟这个单词的意思相类似
在做开发中我们经常遇到这样一个问题,就是一个问题需要执行比较久,但是有需要等待它的结果,于是我们会使用线程来做,但是使用线程也会到一个问题,我什么时候调用呢,如果调用早了肯定会出现空指针异常的,今天我的就使用这个future来解决这个问题。
Future相当于拿到一个应用,这个引用在线程没有执行完时里面没有内容,但是获取它不报错,因此你可以持有它,一旦有线程执行完后就有数据了,相信读者听的云里雾里。
private interface Future<T>{
//获取这个Future的引用
T get();
//是否执行完成
boolean isFinish()
}
private interface Callable<T>{
//这个方法执行完之后返回的是一个T类型的对象
T action();
}
private static <T> Future<T> invoke(Callable<T> callable){
AtomicReference<T> result = new AtomicReference<>();
AtomicBoolean isDown = new AtomicBoolean(false);
//开启线程
Thread t = new Thread(()->{
// 这个action相当于是用户传递的函数,执行完后返回一个T
T value = callable.action();
result.set(value);
isDown.set(true);
});
//创建一个Future
Future<T> future = new Future<T>(){
//需要实现两个接口
@Override
public T get() {
//通过这个接口将结果返回去
return result.get();
}
@Override
public boolean isFinish() {
//这个接口表明数据已经传递过去了
return isDown.get();
}
}
return future;
}
public static void main(String[] args) throws InterruptedException {
// testmapping();
Future<String> tFuture = invoke(() -> {
try {
Thread.sleep(5000);
return "I am finished";
} catch (InterruptedException e) {
return "error";
}
});
System.out.println(tFuture.get());
System.out.println(tFuture.get());
System.out.println(tFuture.get());
System.out.println(tFuture.get());
while (!tFuture.isFinish()){
Thread.sleep(100);
}
System.out.println(tFuture.get());
}
/*打印的结果,当有数据的时候就可以使用了
null
null
null
null
I am finished
*/