Ako implementovať volané rozhranie v Jave



Tento článok vám poskytne podrobné a komplexné vedomosti o tom, ako implementovať Vyvolávajúce rozhranie v Jave, na príkladoch.

Programy viacerých vlákien Java sú svedkami použitia rozsiahlych Vyvolateľné a budúce. Za predpokladu nevyhnutných znalostí vlákien a viacvláknového vlákna budú čitatelia schopní lepšie pochopiť diskusiu v tomto článku. Ako v tomto článku vysvetlím Vyvolávajúce rozhranie v Jave.

Rekapitulácia na vláknach

Dovoľte mi však iba stručne predstaviť koncept vlákien. Vlákno je samostatná cesta vykonania, v prípade, že potrebujete vykonať opakovanú úlohu, je možné prácu rozdeliť na viac úloh a priradiť ich k vláknam. Viacvláknovénie je nič iné ako priradenie viacerých vlákien k paralelnému vykonávaniu rôznych úloh, aby bol výsledok rýchly.





Čo je Vyvolávateľné rozhranie v Jave

Pre Java 5 bola zavedená trieda „java.util.concurrent“. Toto volané rozhranie bolo prinesené prostredníctvom balíka súbežnosti, ktorý vyzeral podobne ako rozhranie Runnable. Môže tiež vrátiť akýkoľvek objekt a je schopný vyvolať výnimku. Rozhranie Java Callable používa Generics, čo umožňuje vrátiť akýkoľvek typ objektu. Exekútorský rámec poskytuje metódu submit () na vykonávanie implementácií vyvolaných volaním v skupine vlákien. V skutočnosti sa Java Executor Framework riadi vzormi WorkerThread.

java-interfaceV skupine vlákien môžu používatelia iniciovať vlákna pomocou metódy Executors.newFixedThreadPool (10) a podľa toho jej odoslať úlohu. Spustiteľný súbor funguje ako cieľ vlákna a na definovanie úlohy je povinne implementovaná metóda public void run (). Toto sa vykoná pomocou vlákien v skupine vlákien. Na základe dostupnosti vlákien vo fonde priradí Executor Framework vláknam prácu (spustiteľný cieľ).Ak sa používajú všetky vlákna, úloha musí byť zastavená. Keď vlákno dokončí jednu úlohu, vráti sa do fondu ako dostupné vlákno, ktoré je pripravené prijať budúce úlohy. Callable je podobné ako Runnable a môže vrátiť akýkoľvek typ objektu, keď chceme z úlohy získať výsledok alebo stav.



Vrátenie volaného rozhrania

Java Callable vráti java.util.concurrent. Java Future ponúka metódu cancel () na odstránenie súvisiacej úlohy Vyvolávateľná. Toto je preťažená verzia metódy get (), kde je možné určiť určitý čas čakania na výsledok. Je užitočné vyhnúť sa aktuálnemu vláknu, ktoré môže byť blokované na dlhšie obdobie. Pamätajte, že metóda get je synchrónna metóda a kým volaná osoba nedokončí svoju úlohu a nevráti hodnotu, bude si musieť na volané počkať.

ako používať skener v

Existujú aj metódy „isDone ()“ a „isCancelled ()“ na načítanie aktuálneho stavu asociovanej úlohy s výzvou. Zvážte príklad, kde je potrebné nájsť súčet všetkých čísel od jednej do 100. Môžeme postupne opakovať slučky 1 až 100 a nakoniec ich pridať. Ďalšou možnosťou je delenie a dobývanie. V tejto metóde môžeme čísla zoskupiť tak, aby každá skupina mala presne dva prvky. Nakoniec môžeme túto skupinu priradiť k skupine vlákien. Preto každé vlákno vráti čiastočný súčet paralelne a potom tieto čiastkové súčty pozbiera a sčíta ich, aby získal celý súčet.



Vlastnosti triedy Callable a Future

  • Vyvolávateľná trieda je rozhranie typu SAM, a preto ju možno implementovať do výrazu lambda.

  • Vyzývateľná trieda má iba jednu metódu „call ()“, ktorá obsahuje všetok kód potrebný na asynchrónne vykonávanie.

  • V prostredí spustiteľného rozhrania neexistovala možnosť vrátiť výsledok výpočtu alebo vyvolať výnimku skontrolovanú. Zatiaľ čo pri Callable je k dispozícii vrátenie hodnoty a hodenie zaškrtnutej výnimky.

  • Na získanie výsledkov po dokončení výpočtu je možné použiť metódu Get () triedy Future. Používatelia môžu tiež skontrolovať, či je výpočet dokončený alebo nie, pomocou metódy done ().

    previesť binárne na desatinné java
  • Zrušenie výpočtu pomocou metódy future.cancel () je v niektorých aplikáciách tiež prínosom.

  • Get () sa nazýva blokujúce volanie a pokračuje v blokovaní, kým sa výpočet nedokončí.

Porovnanie volaných a spustiteľných tried

Vyvolávateľná Spustiteľné
Je súčasťou „ java.util.concurrent ' balík od verzie Java 1.5Je súčasťou balíka java.lang od verzie Java 1.0
Parametrizované rozhranie, napríklad VyvolateľnéNeparametrické rozhranie
Schopný vyhodiť zaškrtnutú výnimkuNemôže hodiť zaškrtnutú výnimku
Obsahuje jednu metódu call (), ktorá vracia Type V, čo je rovnaké ako definovaný parameter rozhrania “Type”Tu obsahuje jednu metódu nazvanú run (), ktorá vracia neplatnosť

Ďalej uvádzame jednoduchý príklad implementovanej triedy Java, kde kód vráti názov konkrétneho vlákna, ktoré vykoná úlohu po jednej sekunde. Tu používame rámec extraktora na vykonávanie 100 úloh paralelne s programom Java Future k výsledku zadaných úloh. Prvý úryvok je výstup a nasledujúci predstavuje kód.

balík com.journaldev.threads import java.util.ArrayList import java.util.Date import java.util.List import java.util.concurrent.Callable import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutorService import java .util.concurrent.Executors import java.util.concurrent.Future public class MyCallable implements Callable {@Override public String call () throws Exception {Thread.sleep (1000) // návrat názvu vlákna vykonávajúceho túto volanú úlohu návrat Thread.currentThread () .getName ()} public static void main (String args []) {// Získajte ExecutorService z triedy pomocných nástrojov Executors, veľkosť fondu vlákien je 10 ExecutorService executor = Executors.newFixedThreadPool (10) // vytvorte zoznam, ktorý bude obsahovať budúcnosť objekt spojený s Vyvolateľným zoznamomlist = nový ArrayList() // Vytvoriť inštanciu MyCallable Vyvolávateľná callable = nová MyCallable () pre (int i = 0 i<100 i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable) //add Future to the list, we can get return value using Future list.add(future) } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ '::'+fut.get()) } catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } //shut down the executor service now executor.shutdown() } } 

Vypínanie služieb vykonávateľa

Kľúčovým a dôležitým aspektom, ktorý mnohým vývojárom chýba, je vypnutie služby ExecutorService. ExecutorService je životne dôležitá a je vytvorená s ďalšími prvkami vlákna. Majte na pamäti, že JVM sa zastaví, len keď sú zastavené všetky vlákna, ktoré nie sú démonmi. Jednoduché vypnutie služby exekútora tak zabráni zastaveniu JVM.

Aby sme službe exekútorov povedali, že nie je potrebné spúšťať vlákna, mali by sme službu vypnúť.

verejný reťazec tostring ()

Existujú tri spôsoby, ako vyvolať vypnutie:

  • vypnutie void () - Toto iniciuje systematické vypnutie, pri ktorom sa vykonávajú skôr zadané úlohy, ale neprijímajú sa žiadne nové úlohy.
  • Vypnutie zoznamu Teraz () - Pokúša sa zastaviť všetky aktívne vykonávajúce úlohy, zastaví spracovanie čakajúcich úloh a tiež vráti zoznam úloh, ktoré čakali na vykonanie.
  • void awaitTermination () - Toto pokračuje v blokovaní, kým sa po dokončení žiadosti o vypnutie alebo po uplynutí časového limitu nedokončia všetky úlohy. Blokuje sa tiež pri prerušení aktuálneho vlákna. Všetko závisí od toho, ktorá úloha bude na prvom mieste.

Týmto sa dostávame na koniec článku Vyvolávateľné rozhranie v Jave. Dúfam, že ste porozumeli rozhraniu Future and Callable Interface v jazyku Java.

Pozrite sa na autor: Edureka, dôveryhodná online vzdelávacia spoločnosť so sieťou viac ako 250 000 spokojných študentov rozmiestnených po celom svete. Výcvikový a certifikačný kurz Edureka Java J2EE a SOA je určený pre študentov a profesionálov, ktorí chcú byť vývojármi Java.

Máte na nás otázku? Uveďte to v sekcii komentárov v tomto blogu „Vyvolávajúce rozhranie v Jave“ a my sa vám ozveme čo najskôr.