Когда метод call () вызывается в Java Executor с использованием объектов Callable? - PullRequest
6 голосов
/ 17 марта 2010

Это пример кода из примера . Что мне нужно знать, это когда 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);
  }
}

Ответы [ 3 ]

9 голосов
/ 17 марта 2010

Как только вы получите submitted вызываемого, исполнитель назначит вызов для выполнения. В зависимости от исполнителя это может произойти напрямую или когда поток станет доступным.

Вызов get, с другой стороны, только ожидает получения результата вычисления.

Если быть точным: Где-то между submit, вызываемым и возвращающимся вызовом get, вызывается вызываемый объект.

4 голосов
/ 17 марта 2010

Вся идея использования Executor заключается в том, что вас не должно волновать , когда именно вызывается метод.

Единственное, что гарантировано в общем случае, - это то, что метод будет выполнен, когда get() из Future вернется.

Когда именно он будет вызван, зависит от того, какой Executor вы используете. С фиксированным пулом потоков, который вы используете в этом примере, метод call() будет вызываться, как только будет свободный поток, и никакая другая задача не будет стоять перед данной задачей в очереди (при условии, что задач достаточно у вас будет 3 call() вызова методов, запущенных в любой момент времени в вашем примере.

0 голосов
/ 17 марта 2010

Ответ на вопрос «когда будет вызываться расписание» лежит в java.util.concurrent.ThreadPoolExecutor # execute реализация (по умолчанию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...