多线程----Future
来源:互联网 发布:js日历控件代码和效果 编辑:程序博客网 时间:2024/06/06 09:16
Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展。
继承至Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回。
对ListenableFuture添加回调函数:
Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor)
其中 FutureCallback是一个包含onSuccess(V),onFailure(Throwable)的接口。
使用如:
Futures.addCallback(ListenableFuture, new FutureCallback<Object>() { public void onSuccess(Object result) { System.out.printf("onSuccess with: %s%n", result); } public void onFailure(Throwable thrown) { System.out.printf("onFailure %s%n", thrown.getMessage()); }});
同时Guava中Futures对于Future扩展还有:
- transform:对于ListenableFuture的返回值进行转换。
- allAsList:对多个ListenableFuture的合并,返回一个当所有Future成功时返回多个Future返回值组成的List对象。注:当其中一个Future失败或者取消的时候,将会进入失败或者取消。
- successfulAsList:和allAsList相似,唯一差别是对于失败或取消的Future返回值用null代替。不会进入失败或者取消流程。
- immediateFuture/immediateCancelledFuture: 立即返回一个待返回值的ListenableFuture。
- makeChecked: 将ListenableFuture 转换成CheckedFuture。CheckedFuture 是一个ListenableFuture ,其中包含了多个版本的get 方法,方法声明抛出检查异常.这样使得创建一个在执行逻辑中可以抛出异常的Future更加容易
- JdkFutureAdapters.listenInPoolThread(future): guava同时提供了将JDK Future转换为ListenableFuture的接口函数。
下边是一个对于Future的测试demo:
@Testpublic void should_test_furture() throws Exception { ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)); ListenableFuture future1 = service.submit(new Callable<Integer>() { public Integer call() throws InterruptedException { Thread.sleep(1000); System.out.println("call future 1."); return 1; } }); ListenableFuture future2 = service.submit(new Callable<Integer>() { public Integer call() throws InterruptedException { Thread.sleep(1000); System.out.println("call future 2."); // throw new RuntimeException("----call future 2."); return 2; } }); final ListenableFuture allFutures = Futures.allAsList(future1, future2); final ListenableFuture transform = Futures.transform(allFutures, new AsyncFunction<List<Integer>, Boolean>() { @Override public ListenableFuture apply(List<Integer> results) throws Exception { return Futures.immediateFuture(String.format("success future:%d", results.size())); } }); Futures.addCallback(transform, new FutureCallback<Object>() { public void onSuccess(Object result) { System.out.println(result.getClass()); System.out.printf("success with: %s%n", result); } public void onFailure(Throwable thrown) { System.out.printf("onFailure%s%n", thrown.getMessage()); } }); System.out.println(transform.get());}
阅读全文
0 0
- 多线程-Future
- 多线程----Future
- 多线程 Future
- 多线程Callable和Future
- 多线程之Future
- Future和FutureTask(多线程)
- Future-多线程设计模式
- java 多线程 future 基本原理
- 多线程 :Callable和Future
- 多线程--callable、Future、FutureTask
- Java多线程系列-Future
- call future实现多线程
- Future --- 多线程设计模式
- 【多线程系列】future模式
- 多线程基础3-----<future>
- 多线程之6-------Callable & Future
- Java多线程 Callable Future FutureTask
- java多线程Callable和Future
- 561. Array Partition I
- 先码后看 java闭包 侵立删
- 信号基本操作之sigaciton
- Battery模块驱动
- 8月总结
- 多线程----Future
- JVM类加载
- 2017年度总结
- QML之ListView
- OpenERP中多币种处理(外币处理)
- 【C语言】【unix c】如何使用管道实现两个进程间的通信
- Ubuntu16.04安装为知笔记(WizNote)
- okhttp基本调用过程(源码解析)
- 工作总结