Переривання роботи нитки (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. плюс в профіль :)
) Хорошій людині допомогти не шкода :)
Тим більше тезці :) І тим більше, що у нас, якщо Ваша інформація вірна в профілі, різниця в роках на кругле число ... дуже символічно :)