logo

Callable проти майбутнього в Java

У Java багатопотоковість дозволяє виконувати завдання одночасно, покращуючи продуктивність і швидкість реагування. Традиційно розробники використовували інтерфейс Runnable для визначення завдань, але він має два основні обмеження: він не може повертати результат і не може створювати перевірені винятки. Щоб подолати ці проблеми, Java представила інтерфейси Callable і Future у Java 5.

Інтерфейс виклику

The Інтерфейс виклику представляє завдання, яке повертає результат і може викликати виняток. Він схожий на Runnable, але більш гнучкий, оскільки може повертати значення та викидати перевірені винятки.

Java
import 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.

Java
import 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()
Обробка винятків Може створювати перевірені виняткиОбробляє результати та винятки після виконання
Використання Визначає, що виконуватиКерує, відстежує та отримує результат завдання
Створіть вікторину