Правильний вибір за замовчуванням - додати InterruptException до списку кидків. Переривання означає, що інша нитка бажає, щоб ваша нитка закінчилася. Причина цього запиту не стає очевидною і є цілком контекстуальною, тому якщо у вас немає додаткових знань, слід припустити, що це просто дружнє відключення, і все, що дозволяє уникнути цього відключення, є недоброзичливою відповіддю.
Java не випадково викине InterruptException, всі поради не вплинуть на вашу програму, але я зіткнувся з випадком, коли розробник дотримуючись стратегії "проковтування" став дуже незручним. Команда розробила великий набір тестів і багато використовувала Thread.Sep. Тепер ми почали проводити тести на нашому сервері CI, і іноді через дефекти коду застрягли б у постійному очікуванні. Щоб погіршити ситуацію, при спробі скасувати завдання CI він ніколи не закривався, оскільки Thread.Interrupt, який мав на меті перервати тест, не припиняв роботу. Нам довелося увійти до коробки та вручну вбити процеси.
Таким чином, короткий випадок, якщо ви просто кинете InterruptException, ви співпадаєте з наміром за замовчуванням, який має закінчитися. Якщо ви не можете додати InterruptException до свого списку кидків, я б загорнув його у RuntimeException.
Слід зробити дуже раціональний аргумент, що InterruptException має бути самим RuntimeException, оскільки це сприятиме кращому керуванню "за замовчуванням". Це не RuntimeException лише тому, що дизайнери дотримувались категоричного правила, що RuntimeException має представляти помилку у вашому коді. Оскільки InterruptException не виникає безпосередньо з помилки у вашому коді, це не так. Але реально така ситуація, що часто виникає InterruptException, оскільки у вашому коді є помилка (тобто нескінченна петля, мертве блокування), а Переривання - це якийсь інший метод потоку для вирішення цієї помилки.
Якщо ви знаєте, що потрібно зробити раціональну очистку, то зробіть це. Якщо ви знаєте більш глибоку причину переривання, ви можете взяти на себе більш всебічне управління.
Отже, підсумовуючи, ваш вибір для обробки повинен відповідати цьому списку:
- За замовчуванням додайте до кидків.
- Якщо заборонено додавати до кидків, киньте RuntimeException (e). (Кращий вибір декількох поганих варіантів)
- Тільки коли ви знаєте явну причину переривання, обробляйте, як бажано. Якщо ваша обробка відповідає вашому методу, то скидання перерветься викликом до Thread.currentThread (). Interrupt ().