首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

终止JAVA线程(转)

2012-12-21 
停止JAVA线程(转)在开发java多线程时,如果要停止线程这个问题很头痛吧,不过在Java5的java.util.concurrent

停止JAVA线程(转)

在开发java多线程时,如果要停止线程这个问题很头痛吧,不过在Java5的java.util.concurrent中使用interrupt(),让线程在run方法中停止。

简介
在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留。

在Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中详细讲解了舍弃这些方法的原因。那么,我们究竟应该如何停止线程呢?

建议使用的方法
在《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中,建议使用如下的方法来停止线程:

?Code [http://www.xueit.com]
??? private volatile Thread blinker;
??? public void stop() {
??????? blinker = null;
??? }
??? public void run() {
??????? Thread thisThread = Thread.currentThread();
??????? while (blinker == thisThread) {
??????????? try {
??????????????? thisThread.sleep(interval);
??????????? } catch (InterruptedException e){
??????????? }
??????????? repaint();
??????? }
??? }
关于使用volatile关键字的原因,请查看http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#36930 。

当线程处于非运行(Run)状态
当线程处于下面的状况时,属于非运行状态:

当sleep方法被调用。

当wait方法被调用。

当被I/O阻塞,可能是文件或者网络等等。

当线程处于上述的状态时,使用前面介绍的方法就不可用了。这个时候,我们可以使用interrupt()来打破阻塞的情况,如:

?Code [http://www.xueit.com]
public void stop() {
??????? Thread tmpBlinker = blinker;
??????? blinker = null;
??????? if (tmpBlinker != null) {
?????????? tmpBlinker.interrupt();
??????? }
??? }

当interrupt()被调用的时候,InterruptedException将被抛出,所以你可以再run方法中捕获这个异常,让线程安全退出:

?Code [http://www.xueit.com]
try {
?? ....
?? wait();
} catch (InterruptedException iex) {
?? throw new RuntimeException("Interrupted",iex);
}

?

热点排行