Java中的interrupt和stop方法——java中线程停止的方法

简单的看interrupt其实是设置了一个变量。除非有wait(), join(),
sleep()等方法,否则调用interrupt()方法,是没有什么效果的。

stop()确实是终止一个线程的方法。并且终止后,的确回收了部分资源。这里要看资源是什么,如果是socket, 和IO流等,这里需要自己去close().如
果你觉得自己每次在调用的地方写麻烦,那就在线程的finalize()方法里定义如果回收IO流/Socket流/数据库连接等。

另外如果希望在一个线程中杀掉另外一个线程,还是推荐使用stop()方法,虽然java文档中说这个方法很不安全,并且以后在更高级的版本中不再提供该方法。

终止一个线程的方法, 帐前卒 觉得有如下几种:

1. 设置volatile变量或者普通一个全局变量。volatile的好处是保证了不会被java
compiler优化,也就是不会调整语句的执行顺序。例如:

if (a == null) {
    synchronized(a) {
           if (a == null) {
                       a = new instance();
           }
    }
}

上面的语句很有可能被编译器优化为

if (a == null) {
    synchronized(a) {
           a = new instance();
           if (a == null) {
                       
           }
    }
}

这个在java 1.6以上版本反正是支持volatile关键字的。

一般这样终止线程

while(value) {
        // do something
}

// 另外一个线程,会修改value这个bool变量。

2. 使用wait(), join(), sleep()等方法:

public void run() {
  try {
    while(true) {
                // do something
               wait();
    }
  } catch(Exception e){}
}

外面拿到这个线程的reference就可以执行 thread.interrupt(); 这样线程就终止了。

3.  直接执行thread.stop() 方法。

如果// do something这个执行语句中有一个未知的方法,这个方法执行的时间较长以及消耗内存较大。那么如果监控到内存消耗超过一定值,就应该把这个线程
kill掉。那么上面两种方法是无论如何都做不到的。只能只用stop()方法。但stop()方法的劣势也在java doc中有详尽的说明。 帐 前卒
这里就不多说了。