Переривання роботи нитки (interrupte thread)

Переривання роботи нитки (interrupte thread).

Накидав два класи, наследующихся від Runnable. У них проста начинка (Thread.sleep і sout). Я вивчав питання переривання роботи ниток за допомогою interrupted і isInterrupted. Чомусь переривання не відбувається, а виконання програми заціклавается і вилітає помилка:

Після вильоту помилки робота ниток триває нескінченно. Але якщо прибрати з класів, успадкованих від Runnable, виклик Thread.sleep, то програма відпрацьовує нормально. У чому заковика, чому вилітає помилка і чому не завершується робота програми.
Ось main:

Метод sleep є нативним, тобто він реалізований іншою мовою не на Java тому детальне його дослідження злегка утруднене ... але я пішов трохи іншим шляхом, а саме:

і отримав наступну картину - після виконання цього методу interrupted () дорівнює false тому цикл не завершується ... зупинити нитку можна поставивши в блок catch слово break.

Звідси ж видно, що виключення яке виникає під час виконання методу sleep благополучно перехоплюється і виводиться стектрейс, але через те, що я описав вище - нитка спокійно продовжує працювати далі.

Grif респект, з установкою break в try-catch - це заліково придумано, на перший погляд відмінно працює. Залишилося зрозуміти чи є в даному випадку підводні камені.

Тобто існує ймовірність, що thread.interrupt () буде викликано після блоку try / catch до перевірки в циклі while (! Thread.interrupted ()) але вона мабуть дуже мала.

Ось до таких висновків я прийшов розбираючи Вашу задачу.

Я трохи невірно написав після виконання цього методу interrupted () дорівнює false тому цикл не завершується ... зупинити нитку можна поставивши в блок catch слово break. Адже виняток виникає і перехоплюється тільки в разі переривання методу sleep а це означає, що для надійності краще передбачити додаткове переривання нитки, сподіватися тільки на interrupted в чистому вигляді неполучается.

) Можна правда і так:

Ось це, на мій погляд, найбільш працездатний і який можна застосовувати в практиці варіант. Блок while потрібно поміщати в try-catch і все буде ок. А замість e.printStackTrace (); можна вивести яке-небудь повідомлення (наприклад, «робота перервана»), щоб було зрозуміла логіка роботи програми. Дякую за допомогу, Grif. плюс в профіль :)

) Хорошій людині допомогти не шкода :)
Тим більше тезці :) І тим більше, що у нас, якщо Ваша інформація вірна в профілі, різниця в роках на кругле число ... дуже символічно :)