Page 263 - 6571
P. 263
public String call() throws Exception {
return Thread.currentThread().getName();
}
});
System.out.println(future.get());
}
Виклик методу get() блокує потік і чекає завершення вико-
нання задачі, а потім повертає результат її виконання. Але у цьо-
го коду є важлива відмінність – він ніколи не завершить своє ви-
конання. Роботу потоків потрібно завершувати самостійно. Для
цього в інтерфейсі ExecutorService визначено два методи:
shutdown(), який чекає завершення запущених задач і shut-
downNow(), який зупиняє потік негайно:
ExecutorService service =
Executors.newCachedThreadPool();
Future<String> future = null;
try {
for(int i = 0; i < 10; i++) {
future = service.submit( /* задача для виконання
*/ );
System.out.println(future.get());
}
service.shutdown();
} catch (InterruptedException e) {
System.err.println("Tasks interrupted!");
} finally {
service.shutdownNow();
}
Виконавці можуть приймати список задач на виконання за
допомогою методу invokeAll(), який приймає колекцію задач
і повертає список об’єктів класу Future.
List<Callable<String>> callables = Arrays.asList(
() -> {return "Task #1";},
() -> {return "Task #2";},
() -> {return "Task #3";}
);
List<Future<String>> futures;
futures = service.invokeAll(callables);
262