正确理解Java中的Future
说到这个相信很多刚入行的程序员,对这个并不是很熟悉,这个单词的意思是未来
简单的给它阐述一下:
这是一个对象,存储的耗时操作给它赋的值,我们先拿到他的引用,等他有值了,就可以使用。
通俗的讲,就是我拿到一个变量的引用,里面没有值,子线程计算完了,把值赋值给它,我后面就可以用,不用我一直等子线程执行完。
看代码:
//首先定义一个接口
public interface Future<T>(){
T get(); //获取这个值
boolean isDone() //知否执行完成
}
//定义一个方法返回Future
public static <T> Future<T> invoke(Callable<T> callable){
//原子引用类型好传递数据
AtomicReference<T> atomicReference= new AtomicReference<T>()
AtomicBooleanisFinished = new AtomicBoolean(false);
Thread t = new Thread(()->{
Thread.sleep(10000);
T value = callable.call();
atomicReference.set(value)
atomicBoolean.set(true)
return "I am Finished";
})
Future<T> future = new Future<T>(){
@Override
public T get() {
return atomicReference.get();
}
@Override
public boolean isDone() {
return isFinished.get();
}
}
//我们这里返回Future
return future;
}
测试
invoke调用后先返回一个Future对象,主线程可以先做后面的事情,在需要使用数据的地方判断下数据时候为空就行
public static void main(String[] args) throws InterruptedException {
Future<String> invoke = invoke(() -> {
Thread.sleep(5_000);
return "I am finished";
});
System.out.println(invoke.get());
while (!invoke.isDone()){
System.out.println("future 还没有执行完");
Thread.sleep(1_000);
}
System.out.println(invoke.get());
}
结果
null
future 还没有执行完
future 还没有执行完
future 还没有执行完
future 还没有执行完
future 还没有执行完
I am finished
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)