Daudzsavienojums Java apmācībā ar piemēriem

Satura rādītājs:

Anonim

Jebkurai lietojumprogrammai var būt vairāki procesi (gadījumi). Katru šo procesu var piešķirt vai nu kā vienu pavedienu, vai vairākus pavedienus. Šajā apmācībā mēs redzēsim, kā vienlaikus veikt vairākus uzdevumus, kā arī uzzināt vairāk par pavedieniem un sinhronizāciju starp pavedieniem.

Šajā apmācībā mēs uzzināsim:

  • Kas ir viena pavediens
  • Kas ir daudzsavienojums Java?
  • Vītnes dzīves cikls Java
  • Java pavedienu sinhronizācija
  • Java daudzsavienojuma piemērs

Kas ir viena pavediens?

Viena vītne būtībā ir viegla un mazākā apstrādes vienība. Java izmanto pavedienus, izmantojot "Thread Class".

Ir divu veidu pavedieni - lietotāja pavediens un dēmona pavediens (dēmonu pavedieni tiek izmantoti, kad mēs vēlamies tīrīt lietojumprogrammu, un tiek izmantoti fonā).

Kad programma sākas pirmo reizi, tiek izveidots lietotāja pavediens. Ievietojiet to, ka mēs varam izveidot daudzus lietotāju pavedienus un dēmonu pavedienus.

Viena pavediena piemērs:

paketes demotest;sabiedrības klase GuruThread{public static void main (String [] args) {System.out.println ("Viens pavediens");}}

Viena pavediena priekšrocības:

  • Samazina pieskaitāmās izmaksas lietojumprogrammā, kad sistēmā tiek izpildīts viens pavediens
  • Turklāt tas samazina lietojumprogrammas uzturēšanas izmaksas.

Kas ir daudzsavienojums Java?

MULTITHREADING Java ir process, kurā vienlaikus tiek izpildīti divi vai vairāki pavedieni, lai maksimāli izmantotu CPU. Vairāku pavedienu lietojumprogrammas izpilda divus vai vairākus vienlaikus darbināmus pavedienus. Tādējādi tas Java ir pazīstams arī kā Vienlaicīgums. Katrs pavediens iet paralēli viens otram. Vairāki pavedieni nepiešķir atsevišķu atmiņas apgabalu, tādējādi tie ietaupa atmiņu. Arī konteksta pārslēgšanās starp pavedieniem prasa mazāk laika.

Vairāku pavedienu piemērs:

paketes demotest;publiskā klase GuruThread1 ievieš Runnable{public static void main (String [] args) {Thread guruThread1 = new Thread ("Guru1");Tēmas guruThread2 = jauns pavediens ("Guru2");guruThread1.start ();guruThread2.start ();System.out.println ("Vītņu nosaukumi ir šādi:");System.out.println (guruThread1.getName ());System.out.println (guruThread2.getName ());}@ Pārvarētpublic void run () {}}

Daudzsavienojuma priekšrocības:

  • Lietotāji netiek bloķēti, jo pavedieni ir neatkarīgi, un mēs reizēm varam veikt vairākas darbības
  • Tā kā šādi pavedieni ir neatkarīgi, pārējie pavedieni netiks ietekmēti, ja viens pavediens atbilst izņēmumam.

Vītnes dzīves cikls Java

Vītnes dzīves cikls:

Vītnes dzīves ciklam ir dažādi posmi, kā parādīts iepriekš diagrammā:

  1. Jauns
  2. Skrienams
  3. Skriešana
  4. Gaida
  5. Miris
  1. Jaunums: Šajā fāzē pavediens tiek izveidots, izmantojot klasi "Thread class". Tas paliek šajā stāvoklī, līdz programma sāk pavedienu. Tas ir arī pazīstams kā dzimis pavediens.
  2. Skrienams: Šajā lapā pavediena gadījums tiek izsaukts ar sākuma metodi. Vītnes vadība tiek piešķirta plānotājam, lai pabeigtu izpildi. Tas, vai palaist pavedienu, ir atkarīgs no plānotāja.
  3. Darbojas: kad pavediens sāk izpildīt, stāvoklis tiek mainīts uz "darbojas". Plānotājs no pavedienu kopas izvēlas vienu pavedienu, un to sāk izpildīt lietojumprogrammā.
  4. Gaida: Šis ir stāvoklis, kad pavedienam ir jāgaida. Tā kā lietojumprogrammā darbojas vairāki pavedieni, ir nepieciešama sinhronizācija starp pavedieniem. Tādējādi vienam pavedienam ir jāgaida, līdz otrais pavediens tiek izpildīts. Tādēļ šo stāvokli sauc par gaidīšanas stāvokli.
  5. Dead: Šis ir stāvoklis, kad pavediens tiek pārtraukts. Vītne ir darba stāvoklī, un tiklīdz tā ir pabeigta, tā ir "mirusi".

Dažas no visbiežāk izmantotajām pavedienu metodēm ir:

Metode Apraksts
sākt() Šī metode sāk pavediena izpildi, un JVM izsauc run () metodi pavedienā.
Miega režīms (milisekundēs) Šī metode padara pavedienu miega režīmu, tāpēc pavediena izpilde tiks pārtraukta uz norādītajām milisekundēm, un pēc tam atkal pavediens sāk izpildīt. Šī palīdzība pavedienu sinhronizācijā.
getName () Tas atgriež pavediena nosaukumu.
setPriority (int newpriority) Tas maina pavediena prioritāti.
raža () Tas izraisa pašreizējā pavediena apturēšanu un citu pavedienu izpildi.

Piemērs: Šajā piemērā mēs izveidosim pavedienu un izpētīsim iebūvētās metodes, kas pieejamas pavedieniem.

paketes demotest;public class thread_example1 ievieš Runnable {@ Pārvarētpublic void run () {}public static void main (String [] args) {Thread guruthread1 = new Thread ();guruthread1.start ();izmēģināt {guruthread1.sleep (1000);} nozveja (InterruptedException e) {// TODO Automātiski izveidots uztveršanas blokse.printStackTrace ();}guruthread1.setPriority (1);int gurupriority = guruthread1.getPriority ();System.out.println (gurrioritāte);System.out.println ("Thread Running");}}

Koda skaidrojums:

  • 2. koda rindiņa: Mēs izveidojam klasi "thread_Example1", kas ievieš Runnable saskarni (to vajadzētu ieviest jebkurai klasei, kuras gadījumus paredzēts izpildīt ar pavedienu.)
  • 4. koda rindiņa: Tā ignorē palaistās saskarnes palaišanas metodi, jo ir obligāti jāignorē šī metode
  • Kodu rinda 6: Šeit mēs esam definējuši galveno metodi, kādā mēs sāksim pavediena izpildi.
  • Kodu rinda 7: Šeit mēs izveidojam jaunu pavedienu nosaukumu kā "guruthread1", veicot jaunu pavedienu klasi.
  • Kodu rinda 8: mēs izmantosim pavediena "start" metodi, izmantojot instanci "guruthread1". Šeit pavediens sāks izpildīt.
  • 10. koda rindiņa: šeit mēs izmantojam pavediena “miega” metodi, izmantojot “guruthread1” instanci. Tādējādi pavediens gulēs 1000 milisekundes.
  • Kods 9-14: Šeit mēs esam ievietojuši miega metodi izmēģinājuma ķeršanas blokā, jo ir pārbaudīts izņēmums, kas notiek, ti, pārtrauktais izņēmums.
  • 15. koda rindiņa: Šeit mēs iestatām pavediena prioritāti uz 1 no tā, kura prioritāte tā bija
  • 16. koda rindiņa: Šeit mēs iegūstam pavediena prioritāti, izmantojot getPriority ()
  • 17. koda rindiņa: šeit mēs drukājam vērtību, kas iegūta no getPriority
  • 18. koda rindiņa: Šeit mēs rakstām tekstu, ka pavediens darbojas.

Izpildot iepriekš minēto kodu, tiek parādīta šāda izeja:

Izeja:

5 ir pavediena prioritāte, un Thread Running ir teksts, kas ir mūsu koda izeja.

Java pavedienu sinhronizācija

Daudzlīnijās ir programmu asinhronā uzvedība. Ja viens pavediens raksta dažus datus un cits pavediens, kas vienlaikus lasa datus, lietojumprogrammā var rasties neatbilstība.

Ja ir nepieciešams piekļūt koplietotajiem resursiem ar diviem vai vairākiem pavedieniem, tiek izmantota sinhronizācijas pieeja.

Java ir nodrošinājusi sinhronizētas metodes sinhronizētas uzvedības ieviešanai.

Šajā pieejā, tiklīdz pavediens sasniedz sinhronizēto bloku, tad neviens cits pavediens nevar izsaukt šo metodi tajā pašā objektā. Visiem pavedieniem ir jāgaida, līdz šis pavediens pabeidz sinhronizēto bloku un iznāks no tā.

Tādā veidā sinhronizācija palīdz daudzšķiedru lietojumprogrammā. Vienam pavedienam ir jāgaida, kamēr cits pavediens pabeidz izpildi, tad pārējie pavedieni ir atļauti izpildei.

To var rakstīt šādā formā:

Sinhronizēts (objekts){// Sinhronizējamo paziņojumu bloks}

Java daudzsavienojuma piemērs

Šajā piemērā mēs ņemsim divus pavedienus un ienesīsim pavedienu nosaukumus.

1. piemērs:

GuruThread1.javapaketes demotest;publiskā klase GuruThread1 ievieš Runnable {/ *** @param argumentē* /public static void main (String [] args) {Thread guruThread1 = new Thread ("Guru1");Tēmas guruThread2 = jauns pavediens ("Guru2");guruThread1.start ();guruThread2.start ();System.out.println ("Vītņu nosaukumi ir šādi:");System.out.println (guruThread1.getName ());System.out.println (guruThread2.getName ());}@ Pārvarētpublic void run () {}}

Koda skaidrojums:

  • 3. koda rindiņa: mēs esam paņēmuši klasi "GuruThread1", kas ievieš Runnable (to vajadzētu ieviest jebkurai klasei, kuras gadījumus paredzēts izpildīt ar pavedienu.)
  • Kodu rinda 8: Šī ir klases galvenā metode
  • 9. koda rindiņa: Šeit mēs veicam klases Thread izveidošanu un izveidojam instanci ar nosaukumu "guruThread1" un izveidojam pavedienu.
  • 10. koda rindiņa: Šeit mēs veicam klases Thread izveidošanu un izveidojam instanci ar nosaukumu "guruThread2" un izveidojam pavedienu.
  • 11. koda rindiņa: mēs sākam pavedienu, ti, guruThread1.
  • Kodu rindiņa 12: mēs sākam pavedienu, ti, guruThread2.
  • 13. koda rindiņa: teksta izveide kā "Vītņu nosaukumi ir šādi:"
  • 14. koda rindiņa: 1. pavediena nosaukuma iegūšana, izmantojot pavedienu klases metodi getName ().
  • 15. koda rindiņa: 2. pavediena nosaukuma iegūšana, izmantojot pavedienu klases metodi getName ().

Izpildot iepriekš minēto kodu, tiek parādīta šāda izeja:

Izeja:

Vītņu nosaukumi šeit tiek parādīti kā

  • Guru1
  • Guru2

2. piemērs:

Šajā piemērā mēs uzzināsim par vadāmās saskarnes galvenajām metodēm run () un start () un izveidosim divus šīs klases pavedienus un attiecīgi palaidīsim tos.

Mēs arī apmeklējam divas klases,

  • Tas, kas ieviesīs darbināmo saskarni un
  • Vēl viena, kurai būs galvenā metode un kas atbilstoši tiks izpildīta.
paketes demotest;publiskā klase GuruThread2 {public static void main (String [] args) {// TODO Automātiski ģenerētās metodes spraudnisGuruThread3 threadguru1 = jauns GuruThread3 ("guru1");threadguru1.start ();GuruThread3 threadguru2 = jauns GuruThread3 ("guru2");threadguru2.start ();}}klase GuruThread3 ievieš Runnable {Vītnes guruthread;privāts stīgu guruname;GuruThread3 (virknes nosaukums) {guruname = nosaukums;}@ Pārvarētpublic void run () {System.out.println ("Thread running" + guruname);par (int i = 0; i <4; i ++) {System.out.println (i);System.out.println (guruname);izmēģināt {Vītne.miegs (1000);} nozveja (InterruptedException e) {System.out.println ("Vītne ir pārtraukta");}}}public void start () {System.out.println ("Tēma sākta");ja (guruthread == null) {guruthread = jauns pavediens (šis, guruname);guruthread.start ();}}}

Koda skaidrojums:

  • 2. koda rindiņa: Šeit mēs izmantojam klasi "GuruThread2", kurā būs galvenā metode.
  • Kodu rinda 4: Šeit mēs izmantojam klases galveno metodi.
  • Kodu rinda 6-7: Šeit mēs izveidojam klases GuruThread3 (kas izveidota koda zemākajās rindiņās) instanci kā "threadguru1", un mēs sākam pavedienu.
  • Kodu rinda 8-9: Šeit mēs izveidojam vēl vienu klases GuruThread3 instanci (kas ir izveidota koda zemākajās rindiņās) kā "threadguru2", un mēs sākam pavedienu.
  • 11. koda rindiņa: Šeit mēs izveidojam klasi "GuruThread3", kas ievieš darbināmo saskarni (to vajadzētu ieviest jebkurai klasei, kuras gadījumus paredzēts izpildīt ar pavedienu.)
  • Kodu rinda 13-14: mēs ņemam divus klases mainīgos, no kuriem viens ir tipa pavedienu klases un cits virknes klases.
  • Kodu rinda 15-18: mēs ignorējam GuruThread3 konstruktoru, kas ņem vienu argumentu kā virknes tipu (kas ir pavedienu nosaukums), kas tiek piešķirts klases mainīgajam guruname un tādējādi tiek saglabāts pavediena nosaukums.
  • 20. koda rindiņa: Šeit mēs ignorējam palaistās saskarnes run () metodi.
  • Kodu rinda 21: Mēs izvedam pavediena nosaukumu, izmantojot println priekšrakstu.
  • Kodu rinda 22-31: šeit mēs izmantojam cilpu for ar skaitītāju, kas inicializēts uz 0, un tam nevajadzētu būt mazākam par 4 (mēs varam ņemt jebkuru skaitli, tāpēc šeit cilpa darbosies 4 reizes) un palielinās skaitītāju. Mēs drukājam pavediena nosaukumu un arī pavedienu miega režīmā 1000 milisekundes izmēģinājuma ķeršanas blokā, jo miega metode izraisīja pārbaudītu izņēmumu.
  • 33. koda rindiņa: Šeit mēs ignorējam palaistās saskarnes sākuma metodi.
  • 35. koda rindiņa: mēs izlaižam tekstu “Vītne sākta”.
  • Kodu rinda 36-40: Šeit mēs ņemam nosacījumu if, lai pārbaudītu, vai klases mainīgajam guruthread ir vērtība vai nē. Ja tā ir nulle, tad mēs izveidojam instanci, izmantojot pavedienu klasi, kas kā parametru ņem nosaukumu (vērtība, kurai tika piešķirta konstruktors). Pēc tam pavediens tiek palaists, izmantojot sākuma () metodi.

Izpildot iepriekš minēto kodu, tiek parādīta šāda izeja:

Izeja :

Tādējādi ir divas tēmas, divas reizes tiek parādīts ziņojums "Tēma sākta".

Mēs iegūstam pavedienu nosaukumus, tiklīdz esam tos izvadījuši.

Tas notiek ciklā, kur mēs drukājam skaitītāja un pavediena nosaukumu, un skaitītājs sākas ar 0.

Cilpa tiek izpildīta trīs reizes, un starp tām pavediens tiek gulēts 1000 milisekundes.

Tātad, vispirms mēs iegūstam guru1, pēc tam guru2, tad atkal guru2, jo pavediens šeit guļ 1000 milisekundes un pēc tam nākamais guru1 un atkal guru1, pavediens guļ 1000 milisekundes, tātad iegūstam guru2 un pēc tam guru1.

Kopsavilkums :

Šajā apmācībā mēs redzējām Java daudzsavienojošās lietojumprogrammas un to, kā izmantot vienu un vairākus pavedienus.

  • Vairāku pavedienu laikā lietotāji netiek bloķēti, jo pavedieni ir neatkarīgi un vienlaikus var veikt vairākas darbības
  • Dažādi diega dzīves cikla posmi ir:
    • Jauns
    • Skrienams
    • Skriešana
    • Gaida
    • Miris
  • Mēs arī uzzinājām par sinhronizāciju starp pavedieniem, kas palīdz lietojumprogrammai darboties nevainojami.
  • Daudzsavienošana atvieglo daudz citu lietojumprogrammu uzdevumu izpildi.