2012-11-26 3 views
8

나는 Callable<String>입니다. ScheduledExecutorService.scheduleAtFixedRate()을 통해 주기적으로 실행하고 내 호출 가능 파일에서 .call() 호출에 의해 반환 된 모든 문자열 목록을 가져 오려고합니다. scheduleAtFixedRate으로 나는이 라인을 따라 내 Callable를 래핑 사용자 정의 Runnable, 무언가를 출시 할 필요가 Callable (만 Runnable들)을하지 않습니다 당연히정기적으로 Callable을 ScheduledExecutorService를 통해 실행합니다.

final Callable<String> myCallable = ....; 
final ConcurrentLinkedQueue<String> results 
    = new ConcurrentLinkedQueue<String>(); 

Runnable r = new Runnable() { 
    @Override public void run() { 
    try { 
     results.add(myCallable.call()); 
    } catch (Exception e) { 
     results.add(null); // Assuming I want to know that an invocation failed 
    } 
    } 
}; 

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
executor.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS); 

, 나는 내 자신의 정의를 출시하지 않도록하고 싶습니다 (특히 멀티 스레드 코드에서), 이런 종류의 집계를 수행하는 JDK 클래스가 있는지 궁금합니다.

+0

아니, 당신을 위해 모음으로 호출 가능 결과를 넣어 JDK의 기존 유틸리티 없다. – jtahlborn

+0

그건 내가 생각한거야. 감사. –

답변

0

위에서 한 것은 Callable 구현을 다른 일반 클래스로 취급하는 것입니다. 호출 가능 프로그램을 ThreadPool 실행 프로그램에 제출하지 않습니다. Callable.call()을 호출하면 ThreadPoolExecutor가 활용되지 않습니다.

스레드 풀링을 활용하려면 ThreadPool에 Task (Runnable/Callable/ForkJoinTask 등)를 제출해야합니다. Futures를 사용하여 실행 된 결과를 수집 할 수 있습니다.

ForkJoinPool은 JDK 7의 일부로 사용할 수 있습니다. ForkJoinTask를 사용하여 작업을 포크에 결합하십시오. 선물을 사용하지 않는 이유는 무엇입니까? 그것들은 Task의 상태와 그 결과를 알기위한 것입니다.

당신이 볼 않았다 Using Callable to Return Results From Runnables