谷歌提供了一些对于juc包的一些封装,MoreExecutors是对Feture的升级,jdk中的Feture是异步提交任务的返回值,但要获取它的执行结果,需要调用get方法,但此方法是阻塞的。在谷歌的jar包中,提供了MoreExecutors.listeningDecorator这样一个静态方法,入参为juc包的线程池对象,这里采用了委托设计模式。当提交一个任务后,返回一个ListenableFuture对象,这个对象可以被Futures.addCallback作为一个入参,作为被监听的任务,第二个入参为监听的回调函数,需要实现成功的回调和异常捕获后的回调,第三个为线程池对象,当回调被触发时,由它执行回调函数任务。有点类似于生产者与消费者,第一个线程池负责任务的生产,第二个线程池负责任务结果的消费

    1. Executor executor = MoreExecutors.newSequentialExecutor(Executors.newSingleThreadExecutor());
    2. ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
    3. ListenableFuture<?> submit = listeningExecutorService.submit(() -> "hello world");
    4. Futures.addCallback(submit, new FutureCallback(){
    5. @Override
    6. public void onSuccess(@Nullable Object result) {
    7. System.out.println(result);
    8. }
    9. @Override
    10. public void onFailure(Throwable t) {
    11. System.out.println(t);
    12. }
    13. },executor);