U Javi višenitnost omogućuje istovremeno izvođenje zadataka poboljšavajući performanse i odziv. Tradicionalno su programeri koristili Runnable sučelje za definiranje zadataka, ali ono ima dva glavna ograničenja: ne može vratiti rezultat i ne može izbaciti provjerene iznimke. Kako bi prevladala ove probleme, Java je uvela sučelja Callable i Future u Javi 5.
abeceda numerirana
Pozivno sučelje
The Pozivno sučelje predstavlja zadatak koji vraća rezultat i može izazvati iznimku. Sličan je Runnableu, ali je fleksibilniji jer može vratiti vrijednost i izbaciti provjerene iznimke.
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(); } }
Izlaz
Result: 15
Obrazloženje: Pozivni zadatak se podnosi izvršitelju. Izračunava zbroj brojeva od 1 do 5 i vraća rezultat. Rezultat se dohvaća korištenjem future.get() nakon što zadatak završi.
Sučelje budućnosti
The Buduće sučelje predstavlja rezultat asinkronog računanja. Kada pošaljete Callable ili Runnable zadatak ExecutorService-u, on vraća objekt Future.
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(); } } }
Izlaz
Result: 30
Obrazloženje: TheCallablezadatak izračunava10 + 2 and ExecutorService.submit()metoda vraća aFutureobjekt. Korištenjefuture.get()dobivamo rezultat nakon završetka izračuna.
Pozivi vs budućnost
| Značajka | Poziv | Budućnost |
|---|---|---|
| Svrha | Predstavlja zadatak koji vraća rezultat | Predstavlja rezultat asinkronog zadatka |
| Vrsta povrata | Vraća rezultat kada se izvrši | Sadrži rezultat koji vraća Callable |
| Definirano u | java.util.concurrent paket | java.util.concurrent paket |
| Izvršenje | Predano Izvršiteljskoj službi | Vratio ExecutorService.submit() |
| Metode | Ima jednu metodu call() | Ima metode poput get() isDone() cancel() |
| Rukovanje iznimkama | Može izbaciti provjerene iznimke | Obrađuje rezultate i iznimke nakon izvršenja |
| Korištenje | Definira što treba izvršiti | Kontrole nadziru i dohvaćaju rezultat zadatka |