闭锁之future(java并发编程实战5.5.2)
来源:互联网 发布:淘宝问大家回答者删除 编辑:程序博客网 时间:2024/05/16 23:45
1、FutureTask计算通过Callable实现,等价于一个可携带结果的Runnable,并有3个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。
2、一旦FutureTask进入完成状态,会永远停止在这个状态。
3、Future.get的行为依赖于任务的状态。如果已经完成,get得到返回结果。否则被阻塞直到任务转入完成状态,然后返回结果或抛出异常。
4、下例为一个提前开始代价昂贵计算:
以上程序单独开了一个线程进行loadProductInfo,当需要loadProductInfo时,可调用get返回这些数据,如果这些数据还没准备好,get将阻塞或抛出异常。
在Preloader中,如果get抛出一个ExecutionException,有3种原因:
1)Callable抛出受检查的异常,或是一个RuntimeException,或是一个Error。
2)使用launderThrowable方法封装复杂的异常处理逻辑。
public static RuntimeException launderThrowable(Throwable t){
if (t instanceof RuntimeException) return (RuntimeException) t;
else if ( t instanceof Error) throw (Error)t;
else throw new IllegalStateException("Not unchecked",t);
}
2、一旦FutureTask进入完成状态,会永远停止在这个状态。
3、Future.get的行为依赖于任务的状态。如果已经完成,get得到返回结果。否则被阻塞直到任务转入完成状态,然后返回结果或抛出异常。
4、下例为一个提前开始代价昂贵计算:
public class preloader{ private final FutureTask<ProductInfo> future= new FutureTask<ProductInfo> (new Callable<ProductInfo>(){ public ProductInfo call() throws DataLoadException{ return loadProductInfo(); } }); private final Thread thread=new Thread(future); public void start(){thread.start();} public ProductInfo get() throws DataLoadException,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(Throwable t){
if (t instanceof RuntimeException) return (RuntimeException) t;
else if ( t instanceof Error) throw (Error)t;
else throw new IllegalStateException("Not unchecked",t);
}
0 0
- 闭锁之future(java并发编程实战5.5.2)
- 闭锁之CountDownLatch(java并发编程实战5.5.1)
- Java并发编程实战--闭锁 CountDownLatch
- Java并发编程之闭锁CountDownLatch简介
- Java并发编程 闭锁Latch
- Java并发编程之闭锁CountDownLatch和栅栏(CyclicBarrier)
- Java并发编程之Callable,Future,FutureTask
- 并发编程之倒计数闭锁CountDownLatch
- java并发编程学习2--Future
- java多线程并发---闭锁
- Java并发编程:Callable、Future
- Java并发编程实践之Callable,Future,RutureTask的使用
- Java并发编程-Executor框架之Callable和Future接口
- java并发编程系列之Callable与Future的应用
- Java并发编程之Executor,Executors,ExecutorService,Future,Callable
- Java并发编程之线程池、Callable和Future使用
- Java并发编程-Executor框架之Callable和Future接口
- Java并发之Callable、Future
- 60款顶级大数据开源工具
- 后退N帧协议(gbn)
- 宏定义中##符号的作用
- A1098. Insertion or Heap Sort (25)
- python编码
- 闭锁之future(java并发编程实战5.5.2)
- play 内置对象
- 阿里提供maven映射服务
- C++浅拷贝和深拷贝的区别
- MXNet基本介绍
- Android关于屏幕是否亮屏和是否解锁的判断
- Redis 存储机制
- 操作系统下载
- JAVA8中Lambda表达式入门