java-FutureTask闭锁

1、FutureTask计算通过Callable实现,等价于一个可携带结果的Runnable,并有3个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。

2、一旦FutureTask进入完成状态,会永远停止在这个状态。

3、Future.get的行为依赖于任务的状态。如果已经完成,get得到返回结果。否则被阻塞直到任务转入完成状态,然后返回结果或抛出异常。

4、下例为一个提前开始代价昂贵计算:

public class preloader{

   private finalFutureTask<ProductInfo> future=

    newFutureTask<ProductInfo> (newCallable<ProductInfo>(){

      public ProductInfo call() throws DataLoadException{

          returnloadProductInfo();

      }

   });

  private final Thread thread=newThread(future);

  public void start(){thread.start();}

  public ProductInfo get() throwsDataLoadException,InterruptedException{

      try{

            return future.get();

      }catch(ExecutionException e){

          Throwable cause=e.getCause();

          if (cause instanceof DataLoadException)

             throw (DataLoadException) cause;

          else

             throw launderThrowable(cause);

      }

 

  }

}

以上程序单独开了一个线程进行loadProductInfo,当需要loadProductInfo时,可调用get返回这些数据,如果这些数据还没准备好,get将阻塞或抛出异常。

在Preloader中,如果get抛出一个ExecutionException,有3种原因:

1)Callable抛出受检查的异常,或是一个RuntimeException,或是一个Error。

2)使用launderThrowable方法封装复杂的异常处理逻辑。

public static RuntimeException launderThrowable(Throwablet){

    if (tinstanceof RuntimeException) return (RuntimeException) t;

    elseif  ( t instanceof Error) throw (Error)t;

    elsethrow new IllegalStateException("Not unchecked",t);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值