Guava - 并行编程Futures详解
Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展。
继承至Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回。
对ListenableFuture添加回调函数:
Futures.addCallback(ListenableFuture<V>,FutureCallback<V>,Executor)
其中FutureCallback是一个包含onSuccess(V),onFailure(Throwable)的接口。
使用如:
Futures.addCallback(ListenableFuture,newFutureCallback<Object>(){ publicvoidonSuccess(Objectresult){ System.out.printf("onSuccesswith:%s%n",result); } publicvoidonFailure(Throwablethrown){ 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同时提供了将JDKFuture转换为ListenableFuture的接口函数。
下边是一个对于Future的测试demo:
@Test publicvoidshould_test_furture()throwsException{ ListeningExecutorServiceservice=MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)); ListenableFuturefuture1=service.submit(newCallable<Integer>(){ publicIntegercall()throwsInterruptedException{ Thread.sleep(1000); System.out.println("callfuture1."); return1; } }); ListenableFuturefuture2=service.submit(newCallable<Integer>(){ publicIntegercall()throwsInterruptedException{ Thread.sleep(1000); System.out.println("callfuture2."); //thrownewRuntimeException("----callfuture2."); return2; } }); finalListenableFutureallFutures=Futures.allAsList(future1,future2); finalListenableFuturetransform=Futures.transform(allFutures,newAsyncFunction<List<Integer>,Boolean>(){ @Override publicListenableFutureapply(List<Integer>results)throwsException{ returnFutures.immediateFuture(String.format("successfuture:%d",results.size())); } }); Futures.addCallback(transform,newFutureCallback<Object>(){ publicvoidonSuccess(Objectresult){ System.out.println(result.getClass()); System.out.printf("successwith:%s%n",result); } publicvoidonFailure(Throwablethrown){ System.out.printf("onFailure%s%n",thrown.getMessage()); } }); System.out.println(transform.get()); }
官方资料主页:https://awk.so/@code.google.com!/p/guava-libraries/wiki/ListenableFutureExplained
以上就是对Guava-并行编程Futures的资料整理,后续继续补充相关资料谢谢大家对本站的支持!