如何停止java線程
如何停止java的線程一直是一個困惱我們開發多線程程序的一個問題。這個問題最終在Java5的java.util.concurrent中得到了回答:使用,讓線程在run方法中停止。
簡介
在Java的多線程編程中,java.lang.Thread類型包含了一些列的方法, , and , and 。通過這些方法,我們可以對線程進行方便的操作,但是這些方法中,只有方法得到了保留。
在Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中詳細講解了捨棄這些方法的原因。那麼,我們究竟應該如何停止線程呢?
建議使用的方法在《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中,建議使用如下的方法來停止線程:
stop() {
blinker = stop() {
Thread tmpBlinker = blinker;
blinker = null;
if (tmpBlinker != null) {
tmpBlinker.interrupt();
}
}
當被調用的時候,InterruptedException將被拋出,所以你可以再run方法中捕獲這個異常,讓線程安全退出:
try {
....
wait();
} catch (InterruptedException iex) {
throw new RuntimeException("Interrupted",iex);
}
當線程被I/O阻塞的時候,調用的情況是依賴與實際運行的平台的。在Solaris和Linux平台上將會拋出InterruptedIOException的異常,但是Windows上面不會有這種異常。所以,我們處理這種問題不能依靠於平台的實現。如:
InterruptibleReader buflen;
run( ) {
run( ) {
ReaderClass rc = new ReaderClass( );
synchronized(lock) {
rc.start( );
while (!done) {
try {
lock.wait( );
} catch (InterruptedException ie) {
done = true;
rc.interrupt( );
try {
is.close( );
} catch (IOException ioe) {}
}
}
}
}
}
另外,我們也可以使用InterruptibleChannel接口。 實現了InterruptibleChannel接口的類可以在阻塞的時候拋出ClosedByInterruptException。如: