logo

Callable vs Future Java-ban

Java-ban a többszálú megoldás lehetővé teszi a feladatok egyidejű futtatását, javítva a teljesítményt és a válaszkészséget. Hagyományosan a fejlesztők a Runnable felületet használták a feladatok meghatározására, de ennek két fő korlátja van: nem adhat eredményt, és nem dobhat ellenőrzött kivételeket. Ezek leküzdésére a Java bevezette a Callable és Future felületeket a Java 5-ben.

Hívható interfész

A Hívható felület olyan feladatot jelöl, amely eredményt ad vissza, és kivételt jelenthet. Hasonló a Runnable-hoz, de rugalmasabb, mivel értéket adhat vissza, és ellenőrzött kivételeket dobhat.

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

Kimenet
Result: 15 

Magyarázat: Meghívható feladatot küldünk a végrehajtónak. Kiszámolja a számok összegét 1-től 5-ig, és visszaadja az eredményt. A feladat befejezése után az eredmény a future.get() segítségével kerül lekérésre.



Jövő interfész

A Jövő interfész egy aszinkron számítás eredményét jelenti. Amikor elküld egy hívható vagy futtatható feladatot egy ExecutorService-nek, az egy Future objektumot ad vissza.

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

Kimenet
Result: 30 

Magyarázat: ACallablefeladat számításokat végez10 + 2 and ExecutorService.submit()metódus visszaadja aFutureobjektum. Használatafuture.get()az eredményt a számítás befejezése után kapjuk meg.

Hívható vs jövő

FunkcióHívhatóJövőbeli
Cél Olyan feladatot jelöl, amely eredményt ad visszaEgy aszinkron feladat eredményét reprezentálja
Visszatérés típusa Végrehajtáskor eredményt ad visszaA Callable által visszaadott eredményt tárolja
Meghatározva In java.util.concurrent csomagjava.util.concurrent csomag
Végrehajtás Elküldve az ExecutorService-nekVisszaküldte: ExecutorService.submit()
Mód Egy metódushívása van()Olyan metódusai vannak, mint a get() isDone() cancel()
Kivételkezelés Ellenőrzött kivételeket dobhatA végrehajtás után kezeli az eredményeket és a kivételeket
Használat Meghatározza, hogy mit kell végrehajtaniVezérli, figyeli és lekéri egy feladat eredményét
Kvíz létrehozása