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.
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(); } }
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.
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(); } } }
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 vissza | Egy aszinkron feladat eredményét reprezentálja |
| Visszatérés típusa | Végrehajtáskor eredményt ad vissza | A Callable által visszaadott eredményt tárolja |
| Meghatározva In | java.util.concurrent csomag | java.util.concurrent csomag |
| Végrehajtás | Elküldve az ExecutorService-nek | Visszakü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 dobhat | A végrehajtás után kezeli az eredményeket és a kivételeket |
| Használat | Meghatározza, hogy mit kell végrehajtani | Vezérli, figyeli és lekéri egy feladat eredményét |