2011-09-16 10 views
2

저는 현재 여러 개의 Future을 생성하고 BlockingQueue에 넣는 작업을 수행하기 위해 Akka (Java API/라이브러리)를 사용하려고합니다. 이제는 Callable에서 처리하는 일부 작업이 새 스레드를 만들거나 새 스레드를 사용할 수있게되기를 기다리는 대신 호출하는 스레드에서 빠르게 실행하는 것이 더 빠를 수도 있습니다.Akka/future - Akka가 현재 스레드 또는 운영자를 "사용"할 가치가 있는지 결정합니까?

Future<String> f1 = future(new Callable<String>() { 
        public String call() { 
         return "Hello" + "World"; 
        } 
       }); 

그것은 미래를 호출하는 현재의 thread (호출 가능)에서 실행 또는 내가 잘못 될 수 있습니다 내가 실행 해요 경우 나는 Akka 예를 들어, 정확히하고 있다고 생각한다? 새로운 쓰레드가 생성되었는지 여부를 디스패처가 어떻게 결정할 지 알지 못하기 때문에 아마 잘못되었습니다.

지금은 다른 스레드를 사용하는 ExecutorService를 사용하고 있지만 일부 작업은 실제로 빠르기 때문에 현재 스레드에서 처리 할 수 ​​있습니다. 하지만 나는 Future을 때때로 사용하지 못하는 이유 중 하나 인 BlockingQueue<Future<Float>>을 사용하고 있습니다.

안부,
요하네스

답변

2

아무도이 지정되지 않은 경우 항상 공급 디스패처, 또는 글로벌 기본값에서 스레드를 사용합니다. 같은 스레드를 사용하려면 CallingThreadDispatcher를 전달해야하지만 항상 동기가됩니다. 프로그래머를 제외한 누구도 계산이 싼지 여부를 결정할 수있는 방법이 없습니다.

+0

그래서 어떻게 든 CallingThreadDispatcher와 ehm 사이에서 동적으로 선택할 수 있습니까? 나는 나무 구조를 가로 질러 각 노드와 다른 것들에 대한 자손 또는 자기 계산을 할 것입니다. 따라서 처음 2-3 단계에서는 실제 계산을 병렬로 수행 할 가치가 있다고 가정합니다. 그러나 일부 경우 (수준> 2 또는 적어도 리프 노드에서) 어떻게 든 현재 스레드에서 실행되는 미래를 만들 수 있으면 좋을 것입니다. BlockingQueue에 Future와 nonfutures를 섞어 쓸 수 없기 때문에 저는 일종의 딜레마에 빠져 있습니다. – Johannes

+1

Callable 내에서 계산을하고 Compute 스레드를 DefaultCompletableFuture로 다시 사용하고 직접 완성하십시오. –

+0

'DefaultCompletableFuture'에 대한 Java API/Javadoc 참조를 찾지 못했거나 튜토리얼 만 볼 수 있습니다. -/"순수한"Java (1.7)에서 실행 가능한지 알고 계십니까? 나는 ExecutorService가없는 Future를 만들 수 있다고 생각하지 않기 때문에, 내가 체크 아웃하고 싶은 Akka를 사용해야 할 수도있다 ;-) – Johannes