Значение из фоновой задачи в Java
Запрос к базе может занять сотни миллисекунд. Вынести чтение в фон и вернуть число или строку в основной код удобнее, чем передавать результат через общий массив и следить за гонками вручную.
Callable<V> похож на Runnable, но метод
call() возвращает значение типа V и может
бросать проверяемые исключения. Пул принимает такую
задачу через submit и отдаёт Future<V>:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main {
static int sumSquares(int limit) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(1);
try {
Callable<Integer> work = () -> {
int total = 0;
for (int i = 1; i <= limit; i++) {
total += i * i;
}
return total;
};
Future<Integer> future = pool.submit(work);
return future.get();
} finally {
pool.shutdown();
}
}
public static void main(String[] args) throws Exception {
System.out.println(sumSquares(4));
}
}
Для предела 4 на экране 30: сумма
1 + 4 + 9 + 16. Тип Future<Integer>
совпадает с типом, который возвращает call(),
поэтому get() без приведения даёт Integer.
Если задача не возвращает смыслового значения, достаточно
Runnable и Future<?>: get() лишь
подтверждает завершение. Когда нужен осмысленный ответ,
Callable делает контракт явным уже в сигнатуре.
Поставьте в пул Callable, который возвращает
длину строки "supreme". Выведите результат
get() в main.