Diferența dintre somn și așteptare în Java

Cuprins:

Diferența dintre somn și așteptare în Java
Diferența dintre somn și așteptare în Java

Video: Diferența dintre somn și așteptare în Java

Video: Diferența dintre somn și așteptare în Java
Video: What is difference between sleep, yield and wait method ? || Java Concurrency Interview Question 2024, Noiembrie
Anonim

Diferența cheie – somn vs așteptare în Java

Sleep and wait sunt două metode folosite pentru multithreading în Java. Metoda sleep aparține clasei Thread în timp ce metoda wait este din clasa Object. Diferența cheie dintre somn și așteptare în Java este că, somnul este folosit pentru a suspenda execuția firului curent pentru numărul specificat de milisecunde, în timp ce metoda așteptare este utilizată pentru a determina firul curent să aștepte până când un alt fir invocă notificarea sau notifyAll metoda pentru obiect.

Un fir este cea mai mică unitate de procesare din sistemul de operare. Este un singur flux secvenţial de control în cadrul unui program. Firele sunt ușoare. Multithreading este mecanismul de rulare a mai multor fire în același timp. Limbajele de programare precum Java acceptă multithreading. Multithreadingul are avantaje deoarece permite rularea mai multor fire simultan, iar firele sunt independente unele de altele. Există metode în Java care pot fi folosite pentru multithreading. Două dintre ele dorm și așteaptă.

Ce este somnul în Java?

Există mai multe procese care rulează într-un sistem de operare. Un proces este un program în execuție. Fiecare proces poate avea mai multe fire și există o schimbare de context între aceste fire. În Java, există două moduri de a crea un fir. Adică prin extinderea clasei thread sau prin implementarea interfeței Runnable. Clasa Thread are constructori și metode pentru a crea și a efectua operații pe un fir. Clasa Thread extinde clasa Object și implementează interfața Runnable. Interfața Runnable ar trebui să fie implementată de orice clasă ale cărei instanțe sunt destinate să fie executate de un fir. Când firul de execuție se execută, codul care ar trebui să fie executat este scris în metoda run. Firul care ar trebui să ruleze este selectat de planificatorul de fire. Un singur fir rulează într-un singur proces.

Un fir trece prin mai multe faze. După crearea unui obiect din clasa Thread, programatorul poate invoca metoda de pornire. Înainte de a invoca acea metodă, se spune că firul de execuție este în noua stare. Programatorul de fire selectează un fir de rulat. Dacă firul de execuție nu este încă selectat de către planificatorul firului de execuție, dar dacă metoda de pornire este invocată, atunci firul de execuție este într-o stare rulabilă. După ce planificatorul de fire selectează firul de executat, acesta trece la starea de rulare. Dacă firul de execuție este activ, dar nu este eligibil în prezent pentru a rula, atunci este în stare de nerulat sau blocat. După finalizarea metodei de rulare, firul de execuție trece la starea terminată. Acestea sunt principalele faze ale ciclului de viață al firului.

Există diferite metode disponibile în clasa thread-ului pentru a efectua diferite sarcini. Metoda de somn este utilizată pentru a dormi metoda pentru o anumită perioadă de timp. Sintaxa pentru metoda sleep este public void sleep (milisecunde lungi) aruncă InterruptedException. Aceasta face ca firul de execuție curent să oprească temporar execuția pentru un număr specificat de milisecunde. Dacă un alt fir întrerupe firul curent, starea întreruptă a firului curent este ștearsă atunci când această excepție este aruncată.

Diferența dintre somn și așteptare în Java
Diferența dintre somn și așteptare în Java

Figura 01: Program Java cu metoda sleep

Conform programului de mai sus, metoda de rulare conține cod care ar trebui să fie executat. În programul principal, sunt create două obiecte ale ExampleThread1, iar metodele de pornire sunt invocate pe ele. Acest lucru va permite rularea codului în cadrul metodei run. Se execută un singur fir odată. Cu Firul.somn (1000); va permite primului thread să încheie execuția timp de 1000 de milisecunde. Când un fir este în stare de repaus, programatorul de fire preia celăl alt fir.

Ce este așteptarea în Java?

Mai multe fire de discuție pot accesa o resursă partajată. Poate cauza generarea unei ieșiri incorecte. Sincronizarea firelor de execuție poate fi utilizată pentru a crea un singur fir de execuție pentru a accesa resursa partajată. Presupuneți o situație după cum urmează. Dacă există două fire ca t1 și t2, t1 începe să salveze valori într-un fișier text numit Text1.txt. Aceste valori vor fi folosite pentru alte calcule când revine t1. Dacă t2 începe înainte ca t1 să revină, t2 poate modifica valorile salvate de t1. Acest lucru poate face ca t1 să furnizeze o ieșire greșită. Cu ajutorul sincronizării, atunci când t1 începe să folosească fișierul Text1.txt, acel fișier poate fi blocat, deci este accesibil doar de către t1. T2 nu o poate schimba până când t1 eliberează blocarea pentru a accesa acel fișier text. Când sarcina este finalizată, t1 poate elibera blocarea. Încuietoarea este cunoscută și sub numele de monitor.

Sincronizarea firelor poate fi realizată prin comunicare între fire. O secțiune critică este un segment de cod care accesează resursele partajate. În comunicarea inter-thread, un fir de execuție este întrerupt în secțiunea sa critică, iar un alt fir este permis să intre în aceeași secțiune critică pentru a fi executat. Este implementat folosind metodele wait, notify și notifyAll. Ele aparțin clasei Object. Metoda wait este folosită pentru a permite firului curent să elibereze blocarea și să aștepte până când un alt fir invocă metoda notify sau notifyAll pentru obiect. Metoda de notificare este folosită pentru a trezi un singur fir care așteaptă blocarea. NotifyAll trezește toate firele care așteaptă la blocare.

Diferența dintre somn și așteptare în Java_Figura 02
Diferența dintre somn și așteptare în Java_Figura 02

Figura 02: Clasa pentru calculatoare

Diferența cheie între somn și așteptare în Java
Diferența cheie între somn și așteptare în Java

Figura 03: Metoda principală

Clasa Calculator extinde Thread-ul. Blocul sincronizat este în interiorul metodei de rulare. Metoda pentru buclă și notificare se află în blocul sincronizat. În cadrul metodei principale, o instanță a unui fir de execuție creată și metoda de pornire este apelată pe acea instanță. Metoda principală va aștepta până când firul va da o notificare. La executarea programului, metoda principală așteaptă până la întreaga execuție a metodei run și așteaptă metoda notify. Odată apelată metoda de notificare, metoda principală nu mai așteaptă și începe să execute restul codului. Main așteaptă până când firul Calculator este finalizat. În cele din urmă, rezultatul sumei este tipărit.

Dacă nu există un bloc sincronizat și dacă metoda principală are un cod ca mai jos, ieșirea va fi zero, deoarece nu așteaptă finalizarea celuil alt fir.

Calculator t1=Calculator nou ();

t1. începe ();

System.out.println (t1.sum);

Care este asemănarea dintre somn și așteptare în Java?

Atât sleep, cât și wait sunt metode care pot fi folosite atunci când implementați multithreading în Java

Care este diferența dintre somn și așteptare în Java?

sleep vs așteptare în Java

Metoda de repaus determină suspendarea executării firului curent pentru numărul specificat de milisecunde, în funcție de precizia și acuratețea temporizatoarelor și programatoarelor de sistem. Metoda wait determină firul curent să aștepte până când un alt fir invocă metoda notify sau notifyAll pentru obiect.
Asociere cu blocarea
Metoda de repaus nu eliberează blocarea unui obiect în timpul sincronizării. Metoda de așteptare eliberează blocarea în timpul sincronizării.
Metoda de executare
Metoda de repaus este executată pe firul curent. Metoda așteptare este apelată pe obiect.
Clasa asociată
Sleep este o metodă a clasei Thread. Așteptarea este o metodă a clasei Object.
Finalizare
Procesul de repaus este finalizat după expirarea perioadei specificate. Metoda de așteptare este întreruptă prin apelarea notificării sau notifyToate metodele.

Rezumat – somn vs așteptare în Java

Există mai multe procese care rulează pe sistemul de operare. Fiecare proces poate avea mai multe fire. Un fir este cea mai mică unitate de procesare dintr-un sistem de operare. Limbajul de programare Java acceptă multithreading. Permite rularea mai multor fire simultan. Sleep și așteptarea sunt două metode care pot fi utilizate atunci când implementați multi-threading. Diferența dintre somn și așteptare în Java este că, somnul este folosit pentru a suspenda execuția firului curent pentru numărul specificat de milisecunde, în timp ce metoda așteptare este utilizată pentru a determina firul curent să aștepte până când un alt fir invocă notify sau notifyAll metoda pentru obiect.

Recomandat: