У Java багатопотоковість дозволяє виконувати завдання одночасно, покращуючи продуктивність і швидкість реагування. Традиційно розробники використовували інтерфейс Runnable для визначення завдань, але він має два основні обмеження: він не може повертати результат і не може створювати перевірені винятки. Щоб подолати ці проблеми, Java представила інтерфейси Callable і Future у Java 5.
Інтерфейс виклику
The Інтерфейс виклику представляє завдання, яке повертає результат і може викликати виняток. Він схожий на Runnable, але більш гнучкий, оскільки може повертати значення та викидати перевірені винятки.
Javaimport java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
Вихід
Result: 15
Пояснення: Завдання, що викликається, передається виконавцю. Він обчислює суму чисел від 1 до 5 і повертає результат. Результат отримується за допомогою future.get() після завершення завдання.
Майбутній інтерфейс
The Майбутній інтерфейс представляє результат асинхронного обчислення. Коли ви надсилаєте завдання Callable або Runnable до ExecutorService, воно повертає об’єкт Future.
Javaimport java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
Вихід
Result: 30
Пояснення: TheCallableзавдання обчислює10 + 2 and ExecutorService.submit()метод повертає aFutureоб'єкт. Використанняfuture.get()ми отримуємо результат після завершення обчислення.
Callable vs Future
| Особливість | Викличний | майбутнє |
|---|---|---|
| призначення | Представляє завдання, яке повертає результат | Представляє результат асинхронного завдання |
| Тип повернення | Повертає результат під час виконання | Зберігає результат, повернутий Callable |
| Визначено В | пакет java.util.concurrent | пакет java.util.concurrent |
| виконання | Передано в ExecutorService | Повернуто ExecutorService.submit() |
| методи | Має один метод call() | Має такі методи, як get() isDone() cancel() |
| Обробка винятків | Може створювати перевірені винятки | Обробляє результати та винятки після виконання |
| Використання | Визначає, що виконувати | Керує, відстежує та отримує результат завдання |