Jak implementovat volané rozhraní v Javě



Tento článek vám poskytne podrobné a komplexní znalosti o tom, jak implementovat Callable Interface v Javě s příklady.

Programy Java s více vlákny jsou svědky používání rozsáhlých Volatelné a budoucí. Pod nezbytnou znalostí vláken a vícevláknových vláken budou čtenáři lépe schopni uchopit diskusi v tomto článku. Jak v tomto článku vysvětlím Callable Interface v Javě.

Rekapitulace na vláknach

Dovolte mi však jen krátce představit koncept vláken. Vlákno je samostatná cesta provedení, v případě, že potřebujete provést opakovaný úkol, lze práci rozdělit na více úkolů a přiřadit je vláknům. Vícevláknovénení nic jiného než přiřazení více vláken k paralelnímu provádění různých úkolů, aby se výsledek rychle získal.





Co je Callable Interface v Javě

Pro prostředí Java 5 byla zavedena třída „java.util.concurrent“. Toto volatelné rozhraní bylo přineseno prostřednictvím balíčku souběžnosti, který vypadal podobně jako rozhraní Runnable. Může také vrátit libovolný objekt a je schopen vyvolat výjimku. Rozhraní Java Callable používá Generics, což umožňuje vrátit jakýkoli typ objektu. Exekutor Framework poskytuje metodu submit () pro provádění implementací Callable ve fondu vláken. Ve skutečnosti se Java Executor Framework řídí vzory WorkerThread.

java-interfaceVe fondu vláken mohou uživatelé iniciovat vlákna pomocí metody Executors.newFixedThreadPool (10) a podle toho jí odeslat úkol. Spustitelný soubor funguje jako cíl vlákna a pro definici úkolu je povinně implementována metoda public void run (). To bude provedeno vlákny ve fondu vláken. Na základě dostupnosti vláken ve fondu přiřadí Executor Framework vláknům práci (cíl Runnable).Pokud se používají všechna vlákna, úkol musí být zastaven. Poté, co vlákno dokončí jeden úkol, vrátí se do fondu jako dostupné vlákno, které je připraveno přijmout budoucí úkoly. Callable je podobný Runnable a může vrátit jakýkoli typ objektu, když chceme získat výsledek nebo stav z úkolu.



Návrat volaného rozhraní

Java Callable vrací java.util.concurrent. Java Future nabízí metodu cancel () k odstranění související úlohy Callable. Toto je přetížená verze metody get (), kde lze určit určitou dobu čekání na výsledek. Je užitečné vyhnout se aktuálnímu vláknu, které může být blokováno na delší dobu. Pamatujte, že metoda get je synchronní metoda a dokud volající nedokončí svůj úkol a nevrátí hodnotu, bude muset čekat na volající.

php promění řetězec na pole

K načtení aktuálního stavu přidružené Callable úlohy existují také metody „isDone ()“ a „isCancelled ()“. Zvažte příklad, kde je třeba najít součet všech čísel od jedné do 100. Můžeme smyčku 1 až 100 postupně a nakonec je přidat. Další možností je dělení a dobývání. V této metodě můžeme čísla seskupit tak, aby každá skupina měla přesně dva prvky. Nakonec můžeme tuto skupinu přiřadit k fondu vláken. Proto každé vlákno paralelně vrací částečný součet a poté tyto částečné součty sbírá a přidává je, aby získal celý součet.



Vlastnosti Callable a Future Class

  • Vyvolávaná třída je rozhraní typu SAM, a proto ji lze implementovat do výrazu lambda.

  • Vyvolávaná třída má pouze jednu metodu „call ()“, která obsahuje veškerý kód potřebný k asynchronnímu spuštění.

  • V prostředí spustitelného rozhraní nebylo možné vrátit výsledek výpočtu nebo vyvolat výjimku zkontrolovanou. Zatímco u Callable je k dispozici vrácení hodnoty a vyvolání kontrolované výjimky.

  • Metodu Get () třídy Future lze použít k načtení výsledků po dokončení výpočtu. Uživatelé mohou také zkontrolovat, zda je výpočet dokončen nebo ne, pomocí metody done ().

    java k moci
  • Zrušení výpočtu pomocí metody future.cancel () je v některých aplikacích také přínosem.

  • Get () se nazývá blokující volání a pokračuje v blokování, dokud není výpočet dokončen.

Porovnání Callable a Runnable tříd

Vyvolatelné Spustitelný
Je součástí „ java.util.concurrent ' balíček od Java 1.5Je součástí balíčku java.lang od verze Java 1.0
Parametrizované rozhraní, například CallableNeparametrické rozhraní
Schopen házet zaškrtnutou výjimkuNemůže vyvolat zaškrtnutou výjimku
Obsahuje jedinou metodu call (), která vrací Type V, což je stejné jako u definovaného parametru rozhraní „Type“Zde obsahuje jedinou metodu nazvanou run (), která vrací void

Níže je uveden jednoduchý příklad implementovatelné třídy Java, kde kód vrací název konkrétního vlákna, které provádí úlohu po jedné sekundě. Zde používáme rámec extraktoru k provádění 100 úkolů souběžně s Java Future k výsledku zadaných úkolů. První fragment je výstup a níže představuje kód.

balíček 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 importují java.util.concurrent.Future veřejnou třídu MyCallable implementuje Callable {@Override public String call () hodí Exception {Thread.sleep (1000) // vrátí název vlákna provádějící tuto volatelnou úlohu vrátit Thread.currentThread () .getName ()} public static void main (String args []) {// Získejte ExecutorService z třídy obslužného programu Executors, velikost fondu podprocesů je 10 ExecutorService executor = Executors.newFixedThreadPool (10) // vytvořit seznam pro uchování budoucnosti objekt přidružený k Vyvolatelnému seznamulist = new ArrayList() // Vytvořit instanci MyCallable Vyvolatelná callable = nová MyCallable () pro (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() } } 

Ukončení služby exekutora

Zásadním a důležitým aspektem, který mnoha vývojářům chybí, je vypnutí ExecutorService. ExecutorService je zásadní a je vytvořen s dalšími prvky vlákna. Mějte na paměti, že JVM se zastaví, pouze když jsou zastavena všechna vlákna, která nejsou démonem. Jednoduché vypnutí služby exekutora tak zabrání zastavení JVM.

Abychom službě exekutora řekli, že není potřeba vlákna spouštět, měli bychom službu vypnout.

třídicí pole c ++

Existují tři způsoby, jak vyvolat vypnutí:

  • vypnutí prázdnoty () - Toto iniciuje řádné vypnutí, při kterém jsou prováděny dříve odeslané úkoly, ale nejsou přijímány žádné nové úkoly.
  • Vypnutí seznamuNyní () - Pokouší se zastavit všechny aktivně provádějící úkoly, zastavuje zpracování čekajících úkolů a také vrací seznam úkolů, které čekají na provedení.
  • void awaitTermination () - To pokračuje v blokování, dokud nedojde k dokončení všech úkolů po požadavku na vypnutí nebo k vypršení časového limitu. Blokuje se také při přerušení aktuálního vlákna. Vše záleží na tom, který úkol bude na prvním místě.

S tímto se dostáváme na konec Callable Interface v článku Java. Doufám, že jste porozuměli rozhraní Future and Callable Interface v Javě.

Podívejte se na Edureka, důvěryhodná online vzdělávací společnost se sítí více než 250 000 spokojených studentů rozložených po celém světě. Školicí a certifikační kurz Edureka Java J2EE a SOA je určen pro studenty a profesionály, kteří chtějí být vývojářem Java.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů v tomto blogu „Vyvolávací rozhraní v Javě“ a my se vám ozveme co nejdříve.