正确理解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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值