Ce înseamnă timpul de inactivitate al firului în Java? (Programare, Java, Multithreading)

Luiz Fernando a intrebat.

Care este semnificația timpului de inactivitate în ceea ce privește firele în Java?Citesc Java The Complete Reference ediția a 8-a și spune ceva de genul acesta:

…Un fir poate face o pauză fără a opri alte părți ale programului dumneavoastră. De exemplu, timpul de inactivitate creat atunci când un fir citește date dintr-o rețea sau așteaptă o intrare a utilizatorului poate fi utilizat în altă parte….

4 răspunsuri
xingbin

În acest caz, înseamnă că starea firului este WAITING sau TIMED_WAITING, , ceea ce înseamnă că

Un fir aflat în starea de așteptare așteaptă ca un alt fir să efectueze o anumită acțiune.

Comentarii

  • Nu am înțeles ce este idle pentru că nu sunt vorbitor nativ de limba engleză, deci dacă am înțeles bine „idle” înseamnă timpul în care un thread așteaptă? –  > Por Luiz Fernando.
  • @LuizFernando, Da. Cuvântul englezesc, „Idle” înseamnă „Nu este ocupat”, „nu lucrează” sau „nu este în uz”. Adesea are o conotație negativă, de exemplu, „Persoana aceea de acolo nu ar trebui să fie inactiv, ci ar trebui să lucreze!” sau „Mașina aceea este inactiv mult prea des, ar trebui să găsim o modalitate de a face ceva bani cu ea sau ar trebui să o vindem”. –  > Por Solomon Slow.
Siva

Imaginați-vă că există un singur procesor. Există două lucruri pe care utilizatorul vrea să le facă.

1) Descărcarea unui cântec și redarea lui (să spunem că descărcarea cântecului durează 10 secunde pentru a obține conexiunea la rețea, descărcarea durează 5 secunde și redarea timp de 60 de secunde).2) Copierea unui alt fișier dintr-un dosar în altul (să spunem că copia fișierului durează 3 secunde).

În acest caz, dacă există un singur fir, atunci acel fir așteaptă 10 secunde pentru a obține conexiunea și 5 secunde pentru descărcare, redă melodia timp de 60 de secunde și apoi copiază un alt fișier timp de 3 secunde.

În tot acest timp, când firul așteaptă 10 secunde pentru a obține o conexiune la rețea, nu se face nimic până când nu obține efectiv conexiunea și stă degeaba fără să facă nimic. Acum, atunci când un fir este inactiv, procesorul nu este utilizat. În acest caz, dacă ar fi existat un alt fir, atunci acel fir ar fi putut fi utilizat pentru copierea fișierului timp de 3 secunde, când primul fir așteaptă 10 secunde pentru a obține o conexiune la rețea.

În primul caz, cele 10 secunde se numesc timp de inactivitate.

Alexei Kaigorodov

Un fir poate fi în 2 stări: stare de inactivitate sau stare de lucru. Un fir de lucru ocupă un procesor și execută un anumit program. Un fir în stare de inactivitate nu ocupă un CPU, ci doar memoria centrală. Orice fir inactiv așteaptă un anumit eveniment și, prin urmare, este legat de coada de evenimente corespunzătoare.

De exemplu, un monitor are 2 cozi de așteptare: una pentru firele care încearcă să execute synchronized și cealaltă pentru firele care au invocat o instrucțiune Object.wait() metoda.

Atunci când are loc un eveniment, unul sau toate firele sunt luate din coada de evenimente și plasate în coada procesorului, unde așteaptă ca un procesor să fie liber. Atunci când o unitate centrală de procesare se eliberează, aceasta ia următorul fir din coada procesorului și începe să execute codul său din locul în care a cerut un eveniment și a ajuns în coadă.

Stările reale ale firelor JVM diferă de această imagine simplificată.

nabster

Pot încerca să explic mai bine cu un exemplu care conține o serie de evenimente.

Un program simplu citește intrarea utilizatorului, scrie în baza de date și raportează starea utilizatorului.

Secvența de operațiuni:

  1. Citire utilizator IO [thread A]
  2. Procesare și scriere în baza de date [thread B]
  3. Raportează starea către utilizator [thread A]

În cele de mai sus thread A se va întrerupe după secvență 1 până când este deblocată de thread B. Deci, în timp ce secvența 2 continuă thread A este în stare de inactivitate.