Kako uporabiti vmesnik, ki ga je mogoče klicati, v Javi



V tem članku boste našli podrobno in izčrpno znanje o tem, kako s primeri uporabiti vmesnik Callable Interface v Javi.

Programi z več nitmi Java so priča obsežni uporabi Klicljivo in prihodnost. V predpogojnem poznavanju niti in večnitnosti bodo bralci lažje razumeli razpravo v tem članku. Kot bom v tem članku razložil vmesnik Callable v Java.

Povzetek na niti

Naj pa samo na kratko predstavim koncept niti. Nit je ločena pot izvajanja; v primeru, da morate izvesti ponavljajočo se nalogo, lahko delo razdelite na več nalog in jih dodelite nitam. Večnitnini nič drugega kot dodelitev več niti za vzporedno izvajanje različnih nalog za hiter rezultat.





Kaj je Callable Interface v Javi

Za Javo 5 je bil uveden razred 'java.util.concurrent'. Ta vmesnik, ki ga je mogoče klicati, je bil vstavljen s paketom sočasnosti, ki je bil podoben vmesniku Runnable. Prav tako lahko vrne kateri koli predmet in lahko vrže izjemo. Vmesnik Java Callable uporablja generike in tako omogoča vrnitev katere koli vrste predmeta. Executor Framework daje metodo submit () za izvajanje izvedb Callable v naboru niti. Java Executor Framework se v resnici drži vzorcev WorkerThread.

java-interfaceV področju niti lahko uporabniki iniciirajo niti z uporabo metode Executors.newFixedThreadPool (10) in ji v skladu s tem predložijo nalogo. Izvajalec deluje kot cilj niti, za določanje naloge pa je obvezna izvedba javne metode void run (). To bodo izvedle niti v področju niti. Glede na razpoložljivost niti v področju Executor Framework nitim dodeli delo (cilj, ki ga je mogoče izvesti).Če se uporabljajo vse niti, je treba nalogo zaustaviti. Ko nit zaključi eno nalogo, se vrne v področje kot razpoložljiva nit, ki je pripravljena sprejeti prihodnja opravila. Callable je podoben Runnable in lahko vrne katero koli vrsto predmeta, ko želimo iz naloge dobiti rezultat ali stanje.



Vrnitev vmesnika, ki ga je mogoče klicati

Java Callable vrne java.util.concurrent. Java Future ponuja metodo cancel () za odpravo povezane naloge Callable. To je preobremenjena različica metode get (), kjer lahko določite določen čas čakanja na rezultat. Koristno je, da se izognete trenutni niti, ki je lahko dlje časa blokirana. Ne pozabite, da je metoda get sinhrona metoda in dokler klicatelj ne konča svoje naloge in ne vrne vrednosti, bo moral počakati na klic.

Za pridobitev trenutnega stanja povezane naloge, ki jo je mogoče klicati, obstajata tudi »isDone ()« in »isCancelled ()«. Poglejmo primer, kjer je treba najti vsoto vseh števil od ena do 100. Lahko zaporedoma zapeljemo od 1 do 100 in jih končno dodamo. Druga možnost je z delitvijo in osvajanjem. Pri tej metodi lahko številke razvrstimo tako, da ima vsaka skupina natančno dva elementa. Končno lahko to skupino dodelimo naboru niti. Zato vsaka nit vzporedno vrne delno vsoto in nato zbere te delne vsote in jih doda, da dobi celotno vsoto.



c ++ razvrsti ()

Značilnosti razreda Callable in Future

  • Razred Callable je vmesnik tipa SAM in ga je zato mogoče implementirati v lambda izraz.

  • Razred, ki ga je mogoče klicati, ima samo eno metodo »call ()«, ki vsebuje vso kodo, potrebno za asinhrono izvajanje.

  • V okolju vmesnika, ki ga je bilo mogoče izvajati, ni bilo mogoče vrniti rezultata izračuna ali vrniti preverjene izjeme. Medtem ko je možnost Callable, ki vrne vrednost in vrže preverjeno izjemo, na voljo.

  • Metodo Get () iz razreda Future lahko uporabimo za pridobivanje rezultatov po opravljenem izračunu. Uporabniki lahko tudi preverijo, ali je izračun končan ali ne, z uporabo metode done ().

  • Preklic izračuna z uporabo metode future.cancel () je v nekaterih aplikacijah tudi blagodejno.

  • Get () se imenuje blokirni klic in blokira še naprej, dokler se izračun ne zaključi.

Primerjava razredov, ki jih je mogoče klicati in izvajati

Klicljivo Teče
Je del java.util.concurrent ' paket od Jave 1.5Je del paketa java.lang od Jave 1.0
Parametriziran vmesnik, kot je CallableNeparametriziran vmesnik
Lahko vrže preverjeno izjemoOznačene izjeme ne more vrniti
Vsebuje eno samo metodo, call (), ki vrne tip V, to je enako kot definirani parameter vmesnika 'Type'Tu vsebuje eno samo metodo, imenovano run (), ki vrne void

Spodaj je prikazan preprost primer izvedljivega razreda Java, pri katerem koda vrne ime določene niti, ki opravi nalogo po eni sekundi. Tu uporabljamo ogrodje ekstraktorja za izvajanje 100 nalog vzporedno z Java Future do rezultatov oddanih nalog. Prvi delček je rezultat, spodnji pa predstavlja kodo.

paket 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.ExecutorService .util.concurrent.Executors import java.util.concurrent.Future javni razred MyCallable implementira Callable {@Override public String call () vrže izjemo {Thread.sleep (1000) // vrne ime niti, ki izvaja to klicati nalogo return Thread.currentThread () .getName ()} public static void main (String args []) {// Pridobite ExecutorService iz razreda pomožnega programa Executors, velikost področja niti je 10 ExecutorService executor = Executors.newFixedThreadPool (10) // ustvarite seznam za prihodnost predmet, povezan s seznamom klicanihseznam = nov ArrayList() // Ustvari primerek MyCallable Callable callable = new MyCallable () for (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() } } 

Zaustavitev storitev izvršiteljev

Ključni in pomemben vidik, ki ga mnogi razvijalci pogrešajo, je zaustavitev storitve ExecutorService. ExecutorService je bistvenega pomena in je ustvarjen z dodatnimi elementi niti. Upoštevajte, da se JVM ustavi šele, ko se ustavijo vse niti, ki niso demon. Tako preprosto zaustavitev izvršilne storitve preprečuje, da bi se JVM ustavil.

Če želimo storiti izvršilno službo, da niti ni treba zagnati niti, moramo storitev ustaviti.

Obstajajo trije načini za izklop:

  • izklop void () - S tem se sproži urejen izklop, pri katerem se izvršijo predhodno oddane naloge, nove naloge pa niso sprejete.
  • Izklop seznamaZdaj () - Poskuša ustaviti vsa aktivno izvajanje nalog, ustavi obdelavo čakajočih nalog in vrne tudi seznam nalog, ki so čakale na izvedbo.
  • void awaitTermination () - To se še naprej blokira, dokler se vsa opravila ne končajo po zahtevi za zaustavitev ali pa pride do časovne omejitve. Blokira tudi, ko je trenutna nit prekinjena. Vse je odvisno od tega, katera naloga je na prvem mestu.

S tem smo prišli do konca članka Callable Interface in Java. Upam, da ste razumeli prihodnost in klicljivi vmesnik v Javi.

Oglejte si Edureka, zaupanja vredno podjetje za spletno učenje z mrežo več kot 250.000 zadovoljnih učencev, ki se širijo po vsem svetu. Edurekin tečaj za usposabljanje in certificiranje Java J2EE in SOA je namenjen študentom in strokovnjakom, ki želijo biti razvijalec Java.

Imate vprašanje za nas? Prosimo, omenite ga v oddelku za komentarje tega bloga »Vpoklicljiv vmesnik v Javi« in v najkrajšem možnem času se vam bomo oglasili.