Метод call
Метод call принадлежит интерфейсу Callable и представляет
собой задачу, которая может быть выполнена в отдельном потоке
и вернуть результат. В отличие от метода run интерфейса
Runnable, метод call возвращает значение и может
пробрасывать проверяемые исключения. Параметров метод не принимает.
Результат выполнения задачи возвращается через объект Future,
который получается при отправке задачи в ExecutorService.
Синтаксис
V call() throws Exception
Пример
Давайте создадим задачу, которая возвращает сумму двух чисел, и выполним её в отдельном потоке:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main
{
public static void main(String[] args) throws Exception
{
Callable<Integer> task = () -> {
return 2 + 3;
};
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(task);
Integer res = future.get();
System.out.println(res);
executor.shutdown();
}
}
Результат выполнения кода:
5
Пример
Давайте создадим задачу, которая возвращает строку, и выведем её на экран:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main
{
public static void main(String[] args) throws Exception
{
Callable<String> task = () -> {
return "abcde";
};
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);
String res = future.get();
System.out.println(res);
executor.shutdown();
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте создадим задачу, которая выбрасывает исключение, и обработаем его при получении результата:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main
{
public static void main(String[] args) throws Exception
{
Callable<Integer> task = () -> {
throw new RuntimeException("error");
};
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(task);
try {
Integer res = future.get();
System.out.println(res);
} catch (Exception e) {
System.out.println("Exception caught");
}
executor.shutdown();
}
}
Результат выполнения кода:
"Exception caught"