Установка причины прерывания при прерывании потока - PullRequest
0 голосов
/ 28 февраля 2011

Спасибо за помощь и поддержку, я столкнулся с проблемой, когда у меня есть два потока, один из которых является потоком таймера, а другой - каким-то потоком чтения файлов.Теперь моя основная программа вызывает оба потока.Поток таймера прерывает основную программу по таймауту, а поток чтения файлов вызывает основной поток, если есть некоторые ошибки ввода-вывода.Итак, теперь проблема вступает в силу, основная программа должна знать, кто сработал прерывание, чтобы напечатать, скажем, некоторое состояние прерывания.Итак, как мне достичь этого?Ниже приведены некоторые вещи, которые я не хочу использовать.

  1. Флаг, который используется для установки времени ожидания, и другой флаг для ошибки ввода-вывода (потому что моя основная программа огромна и состоит из нескольких частей, и я не могу этого сделатьпроверять везде)
  2. Каждый поток имеет переменную-член, установленную с кодом состояния, и основную программу, считывающую это при прерывании. (Я согласен с этим, но мне все еще нужно поддерживать объекты потоков, чтобы получить статус,и у меня много нитей File Reader, поэтому мне приходится перебирать каждый поток, чтобы найти прерванный).

Буду признателен за вашу помощь в этом, даже какой-то другой способ, кроме прерываний, тоже подойдет.

1 Ответ

0 голосов
/ 28 февраля 2011

Я делаю это, объявляя переменную Exception, а затем перебрасываю исключение, если ожидающий поток получает прерывание, для которого установлена ​​переменная Exception:

IOException ioex;

synchronized(lockObject) {
    while( true ) {
        try {
            lockObject.wait();
        } catch( InterruptedException e ) {
            if( ioex != null ) { 
                throw ioex;
            }
        }
        ... normal handling ...
    }
}
...