logo

Callable срещу Future в 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
Определено в java.util.concurrent пакетjava.util.concurrent пакет
Изпълнение Изпратено на ExecutorServiceВърнато от ExecutorService.submit()
Методи Има един метод call()Има методи като get() isDone() cancel()
Обработка на изключения Може да хвърля проверени изключенияОбработва резултати и изключения след изпълнение
Използване Определя какво да се изпълниУправлява следи и извлича резултата от задача
Създаване на тест