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中有详尽的说明。 帐 前卒
这里就不多说了。