logo

Callable vs Future Javassa

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.

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

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.

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

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

OminaisuusSoitettavaTulevaisuus
Tarkoitus Edustaa tehtävää, joka palauttaa tuloksenEdustaa asynkronisen tehtävän tulosta
Palautustyyppi Palauttaa tuloksen suoritettunaSäilyttää soitettavan tuloksen
Määritelty sisään java.util.concurrent-pakettijava.util.concurrent-paketti
Toteutus Lähetetty ExecutorServicellePalauttaja ExecutorService.submit()
menetelmät Siinä on yksi menetelmäkutsu ()Sisältää menetelmiä, kuten get() isDone() cancel()
Poikkeuskäsittely Voi heittää tarkistettuja poikkeuksiaKäsittelee tulokset ja poikkeukset suorituksen jälkeen
Käyttö Määrittää mitä suoritetaanOhjaa valvoo ja noutaa tehtävän tuloksen
Luo tietokilpailu