2014-12-18 2 views
0

완료되면 다시 전화 :FutureCallback 내 ListenableFuture를 시작하고 모든 내가 ListenableFutures에 대한 콜백의 중첩 레이어, 이런 일이하기 위해 노력하고있어

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)); 

ListenableFuture<A> futureA = service.submit(() -> a.doSomething()); 

Futures.addCallback(futureA, new FutureCallback<A>() { 
    @Override 
    public void onSuccess(A result) { 
     ListenableFuture<B> futureB = service.submit(() -> b.doSomething(result) 
    } 
}); 

을 어떻게 콜백을 추가 할 때 모두 futureAfutureB 완전한?

이것은 간단한 예이지만 ListenableFuture의 여러 계층을 포함 할 수있는 솔루션을 찾고 있습니다.

+0

'allAsList'를? http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/Futures.html#allAsList (com.google.common.util.concurrent.ListenableFuture ...) –

답변

2

아마도 allAsList을 사용하여 새로운 미래를 창출 할 수 있습니다. (난 당신이 함께 모두 ab을 시작 괜찮다 가정합니다.)

//No idea how A and B are related, so I assume Object 
ListenableFuture<List<? extends Object>> futureAB = Futures.allAsList(futureA, futureB); 
Futures.addCallback(futureAB, ...); 

업데이트 다음은

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)); 

ListenableFuture<A> futureA = service.submit(() -> a.doSomething()); 

Futures.addCallback(futureA, new FutureCallback<A>() { 
    @Override 
    public void onSuccess(final A result) { 
     ListenableFuture<B> futureB = service.submit(() -> b.doSomething(result); 
     Futures.addCallback(futureB, new FutureCallback<B>() { 
       ©Override 
       public void onSuccess(final B resultB) { 
        //Do something with result and resultB. 
       } 
     }); 
    } 
}); 
+0

futureB가 futureA의 결과에 의존하도록 내 질문을 편집했습니다. 미래 B는 미래가 끝날 때까지 존재하지 않습니다.이 경우 제안 사항이 있습니까? – bcoughlan

+0

'futureA' 콜백에서 콜백을 제출 한 후에'futureB'에 콜백을 추가 할 수 있습니다. –

+0

당신의 대답은 정확하지만 복잡한 워크 플로우를 수행함에 따라 복잡한 일이 발생한다는 것을 알았습니다. Java 8 'CompletableFuture' 빌더 스타일 인터페이스는 다중 계층 태스크 실행 문제에 매우 잘 작동합니다. – bcoughlan