Întrerupeți firul (întrerupeți firul).
Am prezentat două clase care moștenesc de la Runnable. Ei au o umplere simplă (Thread.sleep și sout). Am studiat problema întreruperii firelor întrerupte și întrerupte. Din anumite motive, întreruperea nu are loc, iar executarea programului este looped și eroarea se blochează:
După plecarea erorii, activitatea filamentelor continuă pe o perioadă nedeterminată. Dar dacă eliminați Thread.sleep din clasele moștenite de la Runnable, programul se execută în mod normal. Care este problema, de ce apare eroarea și de ce programul nu se termină?
Iată principalele:
Modul de somn este nativ, adică este pusă în aplicare într-o limbă diferită de Java, deci investigația detaliată a acesteia este ușor dificilă ... dar am mers puțin diferit, și anume:
și a obținut următoarea imagine - după ce a executat această metodă, întreruperea () este falsă, astfel încât bucla nu se termină ... opriți firul introducând cuvântul "break" în blocul de captură.
Prin urmare, este clar că excepția care are loc în timpul somnului metoda interceptat cu succes și afișat stektreys, dar din cauza a ceea ce am descris mai sus - firul continuă să lucreze în liniște.
Grif Respect, cu instalarea de pauză în încercare-captură - acest lucru este marcat, la prima vedere merge bine. Rămâne să înțelegem dacă în acest caz există capcane.
Ie există posibilitatea ca thread.interrupt () să fie apelat după blocul try / catch înainte de a verifica în timp (! Thread.interrupted ()), dar se pare că este foarte mic.
Iată la astfel de concluzii, am ajuns să vă înțeleg problema.
Am scris un pic greșit după această metodă întreruptă () este falsă, prin urmare, ciclul nu se termină ... opri firul poate fi pus în pauza de captură bloc cuvânt. După are loc o excepție și este prinsă doar în cazul metodei întreruperii somnului, ceea ce înseamnă că fiabilitatea este mai bine pentru a oferi fire suplimentare de întrerupere, întrerupt se bazează doar pe nepoluchaetsya pură.
) Puteți într-adevăr și așa:
Aceasta, după părerea mea, este opțiunea cea mai practică și practicabilă în practică. Blocul de timp trebuie pus în încercare și totul va fi bine. Și în loc de e.printStackTrace (); puteți emite un mesaj (de exemplu, "munca întreruptă"), astfel încât logica operației programului să fie înțeleasă. Mulțumesc pentru ajutor, Grif. plus pe profil :)
) O persoană bună pentru a ajuta nu este un păcat :)
Mai ales omologul :) Și chiar mai mult, pentru ca noi, dacă informațiile dvs. sunt corecte în profil, diferența de ani la numărul rotund ... este foarte simbolică :)