Я должен волноваться о InterruptedExceptions, если я ничего не прерываю сам?

для первых 10 строк ...

SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT 0,10

для следующих 10 строк

SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT 10,10
34
задан 21 June 2009 в 20:06
поделиться

5 ответов

Нет. InterruptedException генерируется только в том случае, если вы сами прерываете поток. Если вы сами не используете Thread.interrupt () , то я бы либо повторно выбросил его как своего рода «неожиданное исключение», либо зарегистрировал как ошибку и двинулся дальше. Например, в моем коде, когда мне приходится перехватывать InterruptedException и я никогда сам не вызываю interrupt () , я делаю эквивалент

catch (InterruptedException exception) {
    throw new RuntimeException("Unexpected interrupt", exception);
}

, если это неожиданно. Есть много мест, где я намеренно прерываю свои потоки, и в этих случаях я обрабатываю исключения InterruptedException четко определенным образом. Обычно это '

6
ответ дан 27 November 2019 в 17:09
поделиться

Вы должны выйти из метода run () после того, как вы выполнили любую очистку, требуемую вашим потоком.
HTH

0
ответ дан 27 November 2019 в 17:09
поделиться

Если вы не знаете, как справиться с этим в методе, я предлагаю вам объявить его в методе с throws InterruptedException (и его вызывающей стороной и т. Д.)

Если это то, чего вы никогда не ожидаете произойдет, я бы поймал его и заключил в AssertionError.

1
ответ дан 27 November 2019 в 17:09
поделиться

Да, вы необходимо беспокоиться о InterruptedException , так же как вам нужно беспокоиться о любом другом проверенном исключении, которое вы должны либо генерировать, либо обрабатывать.

В большинстве случаев возникает InterruptedException сигнализирует о запросе остановки, скорее всего, из-за того, что поток, в котором выполнялся ваш код, был прерван .

В вашей конкретной ситуации пул соединений, ожидающий получения соединения, Я бы сказал, что это проблема отмены, и вам необходимо прервать сбор, очистку и восстановить прерванный флаг (см. Ниже).


Например, если вы используете какой-то Runnable ] / Callable , запущенный внутри Executor , тогда вам нужно правильно обработать InterruptedException:

executor.execute(new Runnable() {

    public void run() {
         while (true) {
              try {
                 Thread.sleep(1000);
              } catch ( InterruptedException e) {
                  continue; //blah
              }
              pingRemoteServer();
         }
    }
});

Это будет означать, что ваша задача никогда не подчиняется механизму прерывания, используемому исполнителем, и не позволяет правильная отмена / завершение работы.

Вместо этого правильная идиома - восстановить прерванное состояние и затем остановить выполнение:

executor.execute(new Runnable() {

    public void run() {
         while (true) {
              try {
                 Thread.sleep(1000);
              } catch ( InterruptedException e) {
                  Thread.currentThread().interrupt(); // restore interrupted status
                  break;
              }
              pingRemoteServer();
         }
    }
});

Полезные ресурсы :

30
ответ дан 27 November 2019 в 17:09
поделиться

Потоки можно прервать, вызвав Thread.interrupt (). Он используется для изящного сообщения потоку о том, что он должен сделать что-то еще. Обычно это приводит к тому, что блокирующие операции (например, Thread.sleep ()) возвращаются раньше и генерируют InterruptedException. Если поток прерывается, на нем устанавливается флаг. Этот флаг можно запросить с помощью вызова Thread.isInterrupted ().

Если вы не используете прерывание потока и по-прежнему получаете это исключение, вы можете просто выйти из потока (и желательно зарегистрировать исключение).

В общем, это зависит от того, что делает ваше многопоточное приложение.

1
ответ дан 27 November 2019 в 17:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: