Î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.
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(); } }
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 javaJava
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ă | Apelabil | Viitor |
|---|---|---|
| Scop | Reprezintă o sarcină care returnează un rezultat | Reprezintă rezultatul unei sarcini asincrone |
| Tip de returnare | Returnează un rezultat când este executat | Reține rezultatul returnat de un Callable |
| Definit în | pachetul java.util.concurrent | pachetul java.util.concurrent |
| Execuţie | Trimis la ExecutorService | Returnat de ExecutorService.submit() |
| Metode | Are o singură metodă call() | Are metode precum get() isDone() cancel() |
| Tratarea excepțiilor | Poate arunca excepții bifate | Gestionează rezultatele și excepțiile după execuție |
| Utilizare | Definește ce să execute | Controlează monitoare și preia rezultatul unei sarcini |