Использование Thread.interrupt()
- вполне приемлемый способ сделать это. На самом деле, вероятно, предпочтительнее флаг, как было предложено выше. Причина в том, что если вы находитесь в прерывистом блокирующем вызове (например, Thread.sleep
или с использованием операций с каналом java.nio), вы сможете сразу же вырваться из них.
Если вы используйте флаг, вам нужно дождаться завершения операции блокировки, а затем вы можете проверить свой флаг. В некоторых случаях вы должны делать это в любом случае, например, используя стандартные InputStream
/ OutputStream
, которые не прерываются.
В этом случае, когда поток прерывается, он не прерывает IO, однако вы можете легко сделать это в своем коде (и вы должны сделать это в стратегических точках, где вы можете безопасно остановить и очистить)
if (Thread.currentThread().isInterrupted()) {
// cleanup and stop execution
// for example a break in a loop
}
Как я уже сказал, основным преимуществом Thread.interrupt()
является что вы можете немедленно вырваться из прерывистых вызовов, которые вы не можете сделать с флагом.