Întreruperea firelor

Întreruperea firelor,

Am decis să verifice și să fixeze materialul pe curs întrerupt fluxurile, și se confruntă cu faptul că fluxul nu este întreruptă, adică uneori întrerupt, dar garantează nici o întrerupere. De exemplu, în conformitate cu currentThread.interrupt () metoda este de a comuta starea variabilei în starea de întrerupere privată adevărată, dar isInterupted () metoda încă returnează false, și anume, în esență, fluxul nici măcar nu a dat seama că el a încercat să oprească, deși materialul de curs inainte de a suna la fel metoda de somn verifică JVM nu a încercat să oprească pe cineva în cazul în care acest flux, dar somnul vseravno prelucrat și a obținut o buclă infinită. Poate că totul este că întreruperea de instrucțiuni () este trimis la un fir de dormit, și atunci când el doarme toate instrucțiunile pentru el de partea lui, și, de fapt, poate întrerupe fluxul de cuvinte doar o excepție și procesul acesta. Aș dori să facă lumină în această situație, după cum veți fi de acord că este o sursă de erori în viitor. Codul scris special implementează Runnable, și se extinde fir pentru a testa tot felul de obiecte.







Fire-ul are un stat public enum (puteți căuta în Thread.java prin IDEA făcând clic pe oricare dintre proprietățile sale prin apăsarea Ctrl) - starea.
Unele metode (așteptați (), sleep (), join ()) stabilesc starea fie în
WAITING (dacă nu este specificat un timeout, de exemplu join ()), sau
TIMED_WAITING (dacă este specificat un timeout, de exemplu, somnul (1000)).

În aceste state, întreruperea apelului () este întreruptă și așteptarea va fi aruncat InterruptedException fără a emite steagul corespunzător (care returnează starea isInterrupted ()).

P.S. Poate că nu am dreptate.

De asemenea, investighez această problemă toată ziua. Până în prezent am înțeles astfel de momente:






Dacă eliminați somnul () înainte de a apela metoda de întrerupere (), atunci bucla in timp ce nu va porni și firul de copil se termină. Deci, voalul a fost marcat ca adevărat și nu a executat o singură iterație, iar rularea a fost închisă în consecință. Dacă lăsați Thread.sleep (500) în firul principal; stabilind o întârziere de cel puțin 1 chiar și 0 msec, condiția în timp ce nu funcționează. Se pare că prezența unui apel la biletul inainte de a apela kakimto iterapt schimba steagul instantaneu înapoi la false.

Al doilea punct.
Dacă eliminați toate bucla in timp ce, și euthanize firul copil pentru o lungă perioadă de timp, este posibil să dormi în mijlocul trezindu-l iteraptom din fluxul principal și va fi finalizat cu succes:
Se pare că metoda de alunecare monitorizează în permanență pavilionul iterator

În opinia mea, nu. Apelul tik.interrupt () va genera o InterruptedException și codul dvs. va cădea în dispozitivul handler capture (). Și Thread.sleep (60000) nu are nimic de a face cu ea, și dacă ar exista vreun calcul matematic în loc de ea, atunci ar fi întrerupt.

Pur și simplu, la începutul buclei verifică în timp ce valoarea, atunci se execută toate în interiorul buclei, la începutul somnului, îl întrerupse în și în afara blocului try, apoi setat la „pavilion“ poziție falsă din nou în blocul de captură, și din nou pe noi. Verificarea primară în timp ce trece, dar după verificare, când fluxul este adormit atunci întreruperea provoacă o buclă infinită. Aceasta este singura șansă când este Interrupt () = true când comanda este dată fie blocului, fie imediat după.

Informații de la Gândire în Java:
Secțiunea de captură afișează un mesaj de întrerupere, împreună cu valoarea returnată de metoda isInterrupted (). Atunci când un alt fir de apeluri de întrerupere () pentru fluxul, un steag care indică faptul că fluxul a fost întreruptă. Cu toate acestea, acest semnalizator este resetat atunci când excepția este procesată, astfel încât rezultatul din interiorul secțiunii de captură va fi întotdeauna fals. Steagul este utilizat în alte situații în care firul poate examina starea sa întreruptă în afara unei excepții.
Pe baza celor de mai sus, metoda de somn în fluxul trebuie să fie întotdeauna înconjurat de un bloc de captura încerca (o altă versiune a compilatorului nu propustaet) și blocul de captură va reseta întotdeauna opțiunea întrerupe, astfel încât handler de eroare ar trebui să stabilească întreruperea fluxului de (sau alte funcții utile) vrug în cazuri (de exemplu, lungi prelungite vychisletiya etc.) poate spera isInterrupted () metoda și faptul că nu există nici o tratare a erorilor, care se va reseta opțiunea de întrerupere.

12583 cititori / 2417 subiecte







Articole similare

Trimiteți-le prietenilor: