萬盛學電腦網

 萬盛學電腦網 >> 網絡基礎知識 >> 如何停止java線程

如何停止java線程

如何停止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

當線程被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。如:

copyright © 萬盛學電腦網 all rights reserved