Javassa monisäie mahdollistaa tehtävien suorittamisen samanaikaisesti, mikä parantaa suorituskykyä ja reagointikykyä. Perinteisesti kehittäjät ovat käyttäneet Runnable-käyttöliittymää tehtävien määrittämiseen, mutta sillä on kaksi päärajoitusta: se ei voi palauttaa tulosta eikä heittää tarkistettuja poikkeuksia. Näiden voittamiseksi Java esitteli Callable- ja Future-rajapinnat Java 5:ssä.
kuinka monta viikkoa kuukaudessa
Kutsuttava käyttöliittymä
The Kutsuttava käyttöliittymä edustaa tehtävää, joka palauttaa tuloksen ja voi aiheuttaa poikkeuksen. Se on samanlainen kuin Runnable, mutta joustavampi, koska se voi palauttaa arvon ja heittää tarkistettuja poikkeuksia.
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(); } }
Lähtö
Result: 15
Selitys: Kutsuttava tehtävä lähetetään suorittajalle. Se laskee lukujen summan 1-5 ja palauttaa tuloksen. Tulos noudetaan komennolla future.get(), kun tehtävä on valmis.
Tulevaisuuden käyttöliittymä
The Tulevaisuuden käyttöliittymä edustaa asynkronisen laskennan tulosta. Kun lähetät kutsuttavan tai suoritettavan tehtävän ExecutorServicelle, se palauttaa Future-objektin.
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(); } } }
Lähtö
Result: 30
Selitys: TheCallabletehtävälaskuja10 + 2 and ExecutorService.submit()menetelmä palauttaa aFutureesine. Käyttämälläfuture.get()saamme tuloksen, kun laskenta on valmis.
Soitettava vs tulevaisuus
| Ominaisuus | Soitettava | Tulevaisuus |
|---|---|---|
| Tarkoitus | Edustaa tehtävää, joka palauttaa tuloksen | Edustaa asynkronisen tehtävän tulosta |
| Palautustyyppi | Palauttaa tuloksen suoritettuna | Säilyttää soitettavan tuloksen |
| Määritelty sisään | java.util.concurrent-paketti | java.util.concurrent-paketti |
| Toteutus | Lähetetty ExecutorServicelle | Palauttaja ExecutorService.submit() |
| menetelmät | Siinä on yksi menetelmäkutsu () | Sisältää menetelmiä, kuten get() isDone() cancel() |
| Poikkeuskäsittely | Voi heittää tarkistettuja poikkeuksia | Käsittelee tulokset ja poikkeukset suorituksen jälkeen |
| Käyttö | Määrittää mitä suoritetaan | Ohjaa valvoo ja noutaa tehtävän tuloksen |