2010-03-17 8 views
6

이것은 example의 일부 샘플 코드입니다. 내가 알아야 할 것은 call()이 호출 가능 함수에서 호출 될 때인가? 무엇이 그것을 유발 하는가?Callable 객체를 사용하는 Java Executor에서 call() 메서드가 언제 호출됩니까?

public class CallableExample { 

public static class WordLengthCallable 
    implements Callable { 
    private String word; 
    public WordLengthCallable(String word) { 
     this.word = word; 
    } 
    public Integer call() { 
     return Integer.valueOf(word.length()); 
    } 
} 

public static void main(String args[]) throws Exception { 
    ExecutorService pool = Executors.newFixedThreadPool(3); 
    Set<Future<Integer>> set = new HashSet<Future<Integer>>(); 
    for (String word: args) { 
     Callable<Integer> callable = new WordLengthCallable(word); 
     Future<Integer> future = pool.submit(callable); //**DOES THIS CALL call()?** 
     set.add(future); 
    } 
    int sum = 0; 
    for (Future<Integer> future : set) { 
     sum += future.get();//**OR DOES THIS CALL call()?** 
    } 
    System.out.printf("The sum of lengths is %s%n", sum); 
    System.exit(sum); 
    } 
} 

답변

9

당신이 submitted 호출 가능한이되면, 실행 프로그램 실행을 위해 호출 예약합니다. 실행 프로그램에 따라 이것은 직접 또는 스레드가 사용 가능하게되면 발생할 수 있습니다.

한편 get을 호출하면 계산 결과를 검색하기 만 기다립니다.

정확히 말하자면 : submit 사이의 어느 곳에서 호출되고 get이 호출되면 호출 가능 객체가 호출됩니다.

3

Executor을 사용하는 전체 아이디어는 정확히 메소드가 호출 될 때 을 신경 쓰지해야한다는 것입니다.

일반적으로 보장되는 유일한 점은 Futureget()이 반환 될 때 메서드가 실행된다는 것입니다.

정확하게 호출 할 때 사용하는 언어는 Executor입니다. 이 예에서 사용하는 고정 된 스레드 풀을 사용하면 빈 스레드가 있고 다른 작업이 대기열의 주어진 작업 앞에 오지 않으면 즉시 call() 메서드가 호출됩니다. 따라서 충분한 작업이있는 한 귀하의 예제에서 주어진 시간에 3 개의 call() 메서드 호출이 실행됩니다.

+0

내가 예측할 수없는 시간에 사용할 수되는 스레드에 대한 문제를 이해하고 구현을 (기본값)을 실행 java.util.concurrent.ThreadPoolExecutor #에있다, 내가해야 '언제 호출 가능 ** 스케줄이 잡히게 될 것인가 **'- 일정이 잡히면 (submit *) * 내가 알아야 할 것이 전부입니다 :) – MalcomTucker

+0

@Malcom : 나는 그것이 더 좋을 것이라고 생각하지 않습니다. 질문은 스케줄링이 프로그램에 보이지 않거 나 관찰 할 수 없기 때문에 나중에 일정이 잡히면 언제 바뀌겠습니까? –

0

"는 호출이 일정을 것"에 대한 대답은

관련 문제