1. Інтерфейс Callable
Callable
подібний до Runnable
, але є суттєва різниця — він може повертати значення і може кидати виключення. У той час як метод Runnable.run()
не повертає нічого і не може кидати виключення, метод Callable.call()
повертає значення і може кидати виключення.
2. Інтерфейс Future
Future
— це об'єкт, який представляє результат асинхронного завдання. Ви можете використовувати Future
, щоб перевіряти стан завдання та отримати результат від Callable
після його завершення.
Приклад використання Callable
та Future
в Java:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableFutureExample {
public static void main(String[] args) {
// Створення ExecutorService з одним потоком
ExecutorService executor = Executors.newSingleThreadExecutor();
// Створення Callable, який повертає результат у вигляді цілого числа
Callable task = new Callable() {
@Override
public Integer call() throws Exception {
System.out.println("Завдання розпочато");
// Припустимо, що є складне обчислювальне завдання
Thread.sleep(2000); // Імітація довготривалого завдання
System.out.println("Завдання завершено");
return 42; // Повернення результату
}
};
// Надсилання завдання в executor і отримання Future
Future future = executor.submit(task);
try {
// Очікування результату від Callable
Integer result = future.get(); // get() заблокує потік до отримання результату
System.out.println("Результат від завдання: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown(); // Закриття ExecutorService
}
}
}
- Callable: Ми створюємо
Callable
, у якому в методіcall()
імітується довготривале завдання (наприклад,Thread.sleep(2000)
). - ExecutorService: Створюємо
ExecutorService
, використовуючи методExecutors.newSingleThreadExecutor()
, щоб створити один потік. - Future: Після того, як ми надіслали
Callable
доExecutorService
, ми отримуємо об'єктFuture
, який представляє результат завдання.Future.get()
заблокує потік до завершення завдання і поверне результат (або кине виключення, якщо сталася помилка).
Переваги використання Callable
та Future
:
- Callable може повертати результат або кидати виключення, що є корисним у багатопотокових додатках.
- Future дозволяє перевіряти стан завдання та легко отримати результат.
Декілька методів інтерфейсу Future
:
get()
: Очікує завершення завдання і повертає результат.cancel(boolean mayInterruptIfRunning)
: Скасовує завдання.isDone()
: Перевіряє, чи завершено завдання.isCancelled()
: Перевіряє, чи було завдання скасовано.
Перекладено з: Callable và Future trong Java