Kuidas juurutatavat liidest Java-s rakendada



See artikkel annab üksikasjalikke ja põhjalikke teadmisi selle kohta, kuidas Java-sse helistatavat liidest rakendada koos näidetega.

Java mitmekeermeliste programmide tunnistajaks ulatusliku kasutamise Helistatav ja tulevik. Lõngade ja mitmekeermeliste eeltingimuste tundmisel saavad lugejad paremini mõista selles artiklis käsitletud arutelu. Kuna ma selgitan selles artiklis Java helistatavat liidest.

Lõngade kokkuvõte

Lubage mul siiski teha lühike sissejuhatus lõimede mõistesse. Lõng on eraldi teostamise tee, juhul kui peate täitma korduvat ülesannet, võib töö jagada mitmeks ülesandeks ja määrata need lõimedeks. Mitme keermegapole midagi muud kui mitme lõime määramine paralleelselt erinevate ülesannete täitmiseks, et tulemus oleks kiire.





Mis on Java-s helistatav liides

Java 5 jaoks tutvustati klassi “java.util.concurrent”. See helistatav liides toodi sisse samaaegsuspaketi kaudu, mis nägi välja sarnane Runnable liidesega. Samuti võib see tagastada mis tahes objekti ja visata erandi. Java Callable liides kasutab Generics-i, võimaldades seeläbi mis tahes tüüpi objekte tagastada. Executor Framework annab meetodi submiteerida () helistatavate juurutuste teostamiseks lõimude kogumis. Tegelikkuses peab Java Executor Framework kinni WorkerThreadi mustritest.

java-interfaceTeemadekogumis saavad kasutajad lõime algatada meetodi Executors.newFixedThreadPool (10) abil ja vastavalt sellele ülesande esitada. Jooksev toimib lõime sihtmärgina ja ülesande määratlemiseks on kohustuslikult rakendatud avalik void run () meetod. Selle täidavad niidipunktis olevad niidid. Tuginedes lõimide olemasolule basseinis, määrab Executor Framework lõimedele töö (käivitatava sihtmärgi).Kui kõik lõimed on kasutusel, tuleb ülesanne peatada. Kui lõim on ühe ülesande täitnud, naaseb see saadavaloleva lõimena basseini, mis on valmis tulevasi ülesandeid vastu võtma. Helistatav on sarnane Runnable'iga ja võib tagastada mis tahes tüüpi objekti, kui soovime saada ülesandest tulemuse või oleku.



Helistatava liidese tagastamine

Java Callable tagastab java.util.concurrent. Java Future pakub seotud (Callable) ülesande kõrvaldamiseks meetodit Cancel (). See on meetodi get () ülekoormatud versioon, kus saab määrata tulemuse ootamiseks kindla aja. Kasulik on vältida praegust lõime, mis võib olla pikemaks ajaks blokeeritud. Pidage meeles, et meetod get on sünkroonne meetod ja kuni helistatav on oma ülesande lõpule viinud ja väärtuse tagastab, peab ta ootama helistatavat.

Seotud helistatava ülesande praeguse oleku hankimiseks on olemas ka meetodid „isDone ()” ja „isCancelled ()”. Mõelgem näitele, kus tuleb leida kõigi arvude summa ühest 100ni. Võime järjestada 1 kuni 100 järjestikku ja need lõpuks lisada. Teine võimalus on jagamine ja vallutamine. Selle meetodi abil saame grupeerida numbrid nii, et igal rühmal oleks täpselt kaks elementi. Lõpuks saame määrata selle rühma lõimete kogumisse. Seetõttu tagastab iga lõime paralleelselt osalise summa ja seejärel kogub need osalised summad ja lisab need kogu summa saamiseks.



Helistatava ja tulevase klassi tunnused

  • Helistatav klass on SAM-tüüpi liides ja seetõttu saab seda rakendada lambda avaldises.

  • Helistataval klassil on ainult üks meetod 'call ()', mis sisaldab kogu asünkroonseks käivitamiseks vajalikku koodi.

    andmete struktuur ja algoritm javas
  • Jooksva liidese keskkonnas ei olnud võimalust arvutuse tulemust või visatud kontrollitud erandit tagastada. Kusjuures Callable'il on väärtuse tagastamine ja märgitud erandi viskamine saadaval.

  • Kui arvutamine on tehtud, saab tulemuste hankimiseks kasutada klassi Future meetodit Get (). Kasutajad saavad ka meetodi done () abil kontrollida, kas arvutus on lõppenud või mitte.

  • Arvutamise tühistamine meetodi future.cancel () abil on ka mõnes rakenduses õnnistus.

  • Get () nimetatakse blokeerivaks kõneks ja see jätkab blokeerimist seni, kuni arvutus on lõpule viidud.

Helistatavate ja jooksvate klasside võrdlus

Helistatav Jooksev
See on osa java.util.concurrent ' alates Java 1.5-stSee on osa paketist java.lang alates Java 1.0-st
Parameetriline liides, näiteks CallableParameetrimata liides
Suudab visata kontrollitud erandiSee ei saa visata kontrollitud erandit
See sisaldab ühte meetodit call (), mis tagastab tüübi V, see on sama kui määratletud liidese parameeter „Type”Siin sisaldab see ühte meetodit, mida nimetatakse run (), mis tagastab void

Allpool on toodud lihtne näide Java-helistatavast klassist, kus kood tagastab konkreetse lõime nime, mis täidab ülesannet ühe sekundi pärast. Siin kasutame ekstraktoriraamistikku 100 ülesande täitmiseks paralleelselt Java Future'iga esitatud ülesannete tulemusel. Esimene jupp on väljund ja allpool on kood.

pakett 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. Täitjad impordivad java.util.concurrent. Tuleviku avaliku klassi MyCallable realiseerib Callable {@Override public String call () viskab erandi {Thread.sleep (1000) // tagastab selle kutsuva ülesande täitva lõime nime return Thread.currentThread () .getName ()} public static void main (String args []) {// Hankige ExecutorService rakenduseklassi Executors juurest, lõimupaki suurus on 10 ExecutorService executor = Executors.newFixedThreadPool (10) // loendi loomine tuleviku hoidmiseks helistatavate loendiga seotud objektlist = uus ArrayList() // Looge MyCallable eksemplar Callable callable = new MyCallable () domeenile (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() } } 

Täituriteenuste sulgemine

Oluline ja oluline aspekt, millest paljud arendajad puudust tunnevad, on ExecutorService sulgemine. ExecutorService on ülitähtis ja on loodud täiendavate lõimeelementidega. Pidage meeles, et JVM peatub ainult siis, kui kõik mitte-deemoni lõimed on peatatud. Seega takistab JVM-i peatamine lihtsalt testamenditeenuse väljalülitamine.

Kui soovite testamenditäitjale öelda, et lõime ei ole vaja käivitada, peaksime teenuse sulgema.

Väljalülitamiseks on kolm võimalust:

  • tühine sulgemine () - See käivitab korrektse väljalülituse, mille käigus täidetakse varem esitatud ülesanded, kuid uusi ülesandeid ei aktsepteerita.
  • Loendi sulgemineNow () - See üritab peatada kõik aktiivsed toimingud, peatab ootel olevate ülesannete töötlemise ja tagastab ka täitmist ootel olevate ülesannete loendi.
  • void awaitTermination () - See blokeeritakse seni, kuni kõik ülesanded on pärast väljalülitamistaotlust täidetud või saabub ajalõpp. See blokeerib ka praeguse lõime katkestamise. Kõik sõltub sellest, milline ülesanne on esimene.

Sellega jõuame Java-i artikli Callable Interface lõppu. Loodan, et saite aru Java-i tulevikust ja helistatavast liidest.

Vaadake autor Edureka, usaldusväärne veebiõppeettevõte, mille võrgustik koosneb enam kui 250 000 rahulolevast õppijast ja mis levib üle kogu maailma. Edureka Java J2EE ja SOA koolitus- ja sertifitseerimiskursus on mõeldud õpilastele ja spetsialistidele, kes soovivad olla Java arendajad.

Kas teil on meile küsimus? Palun mainige seda selle ajaveebi „Callable Interface in Java“ kommentaaride osas ja võtame teiega ühendust niipea kui võimalik.