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.