正确理解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
posted @   飞航之梦  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示