logo

Callable vs Future în Java

În Java, multithreadingul permite rularea simultană a sarcinilor, îmbunătățind performanța și capacitatea de răspuns. În mod tradițional, dezvoltatorii foloseau interfața Runnable pentru a defini sarcinile, dar are două limitări majore: nu poate returna un rezultat și nu poate arunca excepții verificate. Pentru a le depăși, Java a introdus interfețele Callable și Future în Java 5.

ștergerea cache-ului npm

Interfață apelabilă

The Interfață apelabilă reprezintă o sarcină care returnează un rezultat și poate arunca o excepție. Este similar cu Runnable, dar mai flexibil, deoarece poate returna o valoare și poate arunca excepții verificate.

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();  } } 

Ieșire
Result: 15 

Explicaţie: O sarcină apelabilă este înaintată executorului. Acesta calculează suma numerelor de la 1 la 5 și returnează rezultatul. Rezultatul este preluat folosind future.get() după ce sarcina se termină.



Interfață viitoare

The Interfață viitoare reprezintă rezultatul unui calcul asincron. Când trimiteți o sarcină Callable sau Runnable la un ExecutorService, acesta returnează un obiect Future.

format string java
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();  }  } } 

Ieșire
Result: 30 

Explicaţie: TheCallablesarcina calculează10 + 2 and ExecutorService.submit()metoda returnează aFutureobiect. Folosindfuture.get()obținem rezultatul odată ce calculul se termină.

Apelabil vs viitor

CaracteristicăApelabilViitor
Scop Reprezintă o sarcină care returnează un rezultatReprezintă rezultatul unei sarcini asincrone
Tip de returnare Returnează un rezultat când este executatReține rezultatul returnat de un Callable
Definit în pachetul java.util.concurrentpachetul java.util.concurrent
Execuţie Trimis la ExecutorServiceReturnat de ExecutorService.submit()
Metode Are o singură metodă call()Are metode precum get() isDone() cancel()
Tratarea excepțiilor Poate arunca excepții bifateGestionează rezultatele și excepțiile după execuție
Utilizare Definește ce să executeControlează monitoare și preia rezultatul unei sarcini
Creați un test