Futható és hívható Java-ban

1. Áttekintés

A Java kezdetei óta a multithreading a nyelv egyik fő szempontja. Futható a többszálas feladatok ábrázolásához biztosított alapvető interfész és Hívható a továbbfejlesztett változata Futható amit a Java 1.5-ben adtak hozzá.

Ebben a cikkben megvizsgáljuk mindkét interfész különbségeit és alkalmazásait.

2. Végrehajtási mechanizmus

Mindkét felület olyan feladatot jelent, amelyet több szál is végrehajthat. Futható a feladatok a cérna osztály vagy ExecutorService mivel Hívhatók csak az utóbbi használatával futtatható.

3. Visszatérési értékek

Vizsgáljuk meg mélyebben, hogy ezek az interfészek hogyan kezelik a visszatérési értékeket.

3.1. Val vel Futható

A Futható interfész funkcionális interfész és egyetlen fuss() metódus, amely nem fogad el paramétereket és nem ad vissza értékeket.

Ez alkalmas olyan helyzetekre, amikor nem a szál végrehajtásának eredményét keressük, például bejövő események naplózása:

nyilvános felület Futható {public void run (); }

Értsük meg ezt egy példával:

public class EventLoggingTask megvalósítja a Runnable {private Logger logger = LoggerFactory.getLogger (EventLoggingTask.class); @Orride public void run () {logger.info ("Üzenet"); }}

Ebben a példában a szál csak beolvassa a várólista üzenetét, és naplófájlba naplózza. A feladatból nincs érték; segítségével a feladat elindítható ExecutorService:

public void executeTask () {végrehajtóService = Végrehajtók.newSingleThreadExecutor (); Jövő jövő = végrehajtóSzolgáltatás.submit (új EventLoggingTask ()); executorService.shutdown (); }

Ebben az esetben a Jövő Az objektumnak nincs értéke.

3.2. Val vel Hívható

A Hívható interfész egy általános interfész, amely egyetlen hívás() metódus - amely általános értéket ad vissza V:

nyilvános felület Hívható {V hívás () dobja a Kivételt; }

Vessünk egy pillantást a szám faktoriálisának kiszámítására:

nyilvános osztály a FactorialTask ​​megvalósítja a Callable {int számot; // standard konstruktorok public Integer hívás () InvalidParamaterException {int fact = 1; // ... for (int count = szám; count> 1; count--) {tény = tény * szám; } visszatérési tény; }}

Az eredménye hívás() módszer a Jövő tárgy:

@Test public void whenTaskSubended_ThenFutureResultObtained () {FactorialTask ​​task = new FactorialTask ​​(5); Jövő jövő = végrehajtóSzolgáltatás.submit (feladat); assertEquals (120, jövő.get (). intValue ()); }

4. Kivételek kezelése

Lássuk, mennyire alkalmasak kivételkezelésre.

4.1. Val vel Futható

Mivel a metódus aláírásában nincs megadva a „dobás” záradék,nincs mód további ellenőrzött kivételek terjesztésére.

4.2. Val vel Hívható

Hívható hívása () módszer tartalmazza a „dobásokat Kivétel" záradék, így könnyebben továbbterjeszthetjük az ellenőrzött kivételeket:

public class FactorialTask ​​megvalósítja a Callable {// ... public Integer hívást () InvalidParamaterException {if (szám <0) {dob új InvalidParamaterException ("A számnak pozitívnak kell lennie"); } // ...}}

Futás esetén a Hívható an ExecutorService, a kivételeket az Jövő objektum, amelyet ellenőrizni lehet a Future.get () módszer. Ez dob egy ExecutionException - amely beburkolja az eredeti kivételt:

@Test (várható = ExecutionException.class) public void whenException_ThenCallableThrowsIt () {FactorialCallableTask task = new FactorialCallableTask (-5); Jövő jövő = végrehajtóSzolgáltatás.submit (feladat); Egész eredmény = jövő.get (). IntValue (); }

A fenti tesztben a ExecutionException dobás közben érvénytelen számot adunk át. Felhívhatjuk a getCause () metódus ezen kivétel objektumon az eredeti bejelölt kivétel megszerzéséhez.

Ha nem hívjuk a kap() a metódusa Jövő osztály - akkor a kivétel dobta hívás() A metódust nem jelentjük vissza, és a feladatot továbbra is befejezettként jelöljük meg:

@Test public void whenException_ThenCallableDoesntThrowsItIfGetIsNotCalled () {FactorialCallableTask task = new FactorialCallableTask (-5); Jövő jövő = végrehajtóSzolgáltatás.submit (feladat); assertEquals (hamis, jövő.isDone ()); }

A fenti teszt akkor is sikeres lesz, ha kivételt vetettünk a paraméter negatív értékeire FactorialCallableTask.

5. Következtetés

Ebben a cikkben feltártuk a különbségeket a Futható és Hívható interfészek.

Mint mindig, a cikk teljes kódja elérhető a GitHubon.