2011-01-16 2 views
3

Когда я пересматриваю старый код, я натолкнулся на него.Будет ли лучше использовать isInterrupted вместо прерванного в следующем случае

public void stop() { 
    if (this.simulationThread != null) { 
     this.simulationThread.interrupt(); 

     try { 
      this.simulationThread.join(); 
     } 
     catch (InterruptedException exp) { 
      log.error(null, exp); 
     } 

     this.simulationThread = null; 
    } 
} 

public void run() { 
    while (!Thread.interrupted() && simulationThread == Thread.currentThread()) { 
    } 
} 

Мне было интересно, будет ли это лучше использовать, или это не имеет значения?

public void run() { 
    Thread t = Thread.currentThread(); 
    // Will it better to use isInterrupted, since it will not clear the interrupt 
    // flag? 
    while (!t.isInterrupted() && simulationThread == t) { 
    } 
} 

ответ

2

Это зависит от того, что вы намерены совершить, когда run() выходов. Если ваша функция run() является вашей основной петлей потока, так что вы хотите, чтобы этот поток немедленно выходил после завершения run(), проглотил флаг прерывания Thread#interrupted().

Обычно, это не то, что вы хотите сделать. Если вы пытаетесь включить грациозный выход из функции run(), чтобы разрешить совместную отмену, лучше сохранить сохраненный прерванный флаг для вашего вызывающего абонента и функции блокировки вниз по потоку. Для этого лучше всего использовать Thread#isInterrupted().

Обратите внимание, что в вашей stop() функции, где вы поймать InterruptedException, вы также должны вызвать

Thread.currentThread().interrupt(); 

Это не видно из фрагментов, размещенных здесь, кто звонит stop() и то, что должно произойти после этого, но, опять же, лучше было бы сохранить флаг прерывания, который выскочил stop() из Thread#join(). Просто поймать InterruptedException позволяет stop() реагировать на это прерывание, но ни один вызывающий абонент или последующие блокирующие функции не смогут обнаружить этот запрос прерывания против текущего потока. Другими словами, прерывание потока редко выполняется путем разблокирования одного вызова функции блокировки; запрос прерывания обычно должен полностью распространиться на главную функцию потока, чтобы он мог выйти.

И, наконец, ваше поле simulationThread нестабильно?

Смежные вопросы