Метод invokeAny
Метод invokeAny класса ExecutorService
принимает коллекцию задач Callable, выполняет
их параллельно и возвращает результат первой задачи,
которая успешно завершилась. Как только одна из задач
завершается, все остальные незавершенные задачи
отменяются. В первый параметр мы передаем коллекцию
задач Callable, во второй (необязательный) -
таймаут, а в третий (необязательный) - единицу
измерения времени. Если ни одна задача не завершится
успешно, метод выбросит исключение ExecutionException.
При превышении таймаута выбрасывается
TimeoutException.
Синтаксис
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
Пример
Давайте запустим три задачи и получим результат первой успешно завершившейся:
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main
{
public static void main(String[] args) throws Exception
{
ExecutorService executor = Executors.newFixedThreadPool(3);
List<java.util.concurrent.Callable<String>> tasks = List.of(
() -> {
Thread.sleep(300);
return "abcde";
},
() -> {
Thread.sleep(100);
return "12345";
},
() -> {
Thread.sleep(200);
return "hello";
}
);
String res = executor.invokeAny(tasks);
System.out.println(res);
executor.shutdown();
}
}
Результат выполнения кода:
"12345"
Пример
Давайте зададим таймаут в 1 секунду.
Если ни одна задача не успеет завершиться,
будет выброшено исключение TimeoutException:
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args) throws Exception
{
ExecutorService executor = Executors.newFixedThreadPool(3);
List<java.util.concurrent.Callable<String>> tasks = List.of(
() -> {
Thread.sleep(3000);
return "abcde";
},
() -> {
Thread.sleep(4000);
return "12345";
}
);
try
{
String res = executor.invokeAny(tasks, 1, TimeUnit.SECONDS);
System.out.println(res);
}
catch (java.util.concurrent.TimeoutException e)
{
System.out.println("Timeout");
}
executor.shutdown();
}
}
Результат выполнения кода:
"Timeout"
Смотрите также
-
класс
ExecutorService,
который управляет пулом потоков -
метод
invokeAll,
который выполняет все задачи и возвращает их результаты -
метод
submit,
который отправляет одну задачу на выполнение -
метод
shutdown,
который завершает работу исполнителя