currentThread().interrupt() внутри блока перехвата InterruptedException?

Читая чужой код, я наткнулся на следующее:

class Worker extends Thread {

....

         public void run() {
            try {
                while ( true ) {
                    ..... DO WORK .....
                }
            } catch ( InterruptedException e ) {
                Thread.currentThread().interrupt();
            } catch ( RuntimeException e ) {
                handleFatal( e );
            }
        }
}

Каков эффект от вызова Thread.currentThread().interrupt() внутри блока catch?

Наверняка текущий запущенный поток — этот экземпляр Worker — уже прерван в этот момент? Какой цели служит повторный вызов interrupt() в уже прерванном потоке?


person Mikepote    schedule 15.02.2019    source источник


Ответы (1)


InterruptedException не означает, что поток находится в прерванном состоянии. Это означает, что поток вошел в прерванное состояние, затем метод опроса (например, Object.wait или Thread.sleep) проверяет, был ли поток в прерванном состоянии (это выводит поток из прерванного состояния) и бросает исключение. Поэтому, когда исключение перехвачено, поток больше не находится в прерванном состоянии.

Похоже, что целью этого блока catch является перехват таких исключений и возврат потока в прерванное состояние.

person Leo Aso    schedule 15.02.2019