У меня есть класс, к которому обращаются несколько потоков, каждый поток запрашивает один метод этого класса. Каждый метод, в свою очередь, выполняет количество Callables. Этот класс использует threadPool из ExecutorService для выполнения этих Callables посредством метода invokeAll ((Collection>) executableTasks). Установка выглядит следующим образом:invokeAll vs CompletionService
public MyClass {
private final ExecutorService threadPool = Runtime.getRuntime().availableProcessors();
public void method1() {
List<SomeObject> results = new ArrayList<>();
List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
tasks.add(new Callable<Void>(){ ... results.add(someObject);});
threadPool.invokeAll(tasks);
}
public void method2() {
List<SomeObject> results = new ArrayList<>();
List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
tasks.add(new Callable<Void>(){ ... results.add(someObject);});
threadPool.invokeAll(tasks);
}
}
Я смущен, если это будет выполнять задачи в классе одновременно или invokeAll() блокирует выполнение до задач в один метод завершается (означает выполнение будет происходить одновременно внутри методов, но не в классе уровень)? Или я должен использовать CompletionService для поиска соответствующих результатов задач?
«Итак, да, выполнение будет выполняться одновременно в рамках определенного метода, но не на уровне класса»: но эти 2 метода вызывают в 2 разных потоках, то почему эти задачи (из метода1 и method2) не будут выполняться одновременно –
Упс, я полагаю, должно было прочитать первое предложение. Я исправил свой ответ. Спасибо за совет! –
@Cody Согласитесь с обоими предложениями: методы блокирования и опечатки в определении threadPool. – Smithsonian