网上查了下,线程中断一般用interrupt() 方法,我现在的情况是线程T已经启动,T线程中调用了一个用户函数F,该函数可能会执行很长时间,但我要检测它如果该函数指定时间内未返回就要中断它,并且我的T线程中要能继续处理。我发现用interrupt方法需要在T中调用sleep才会抛出InterruptedException,还有就是通过while (!isInterrupted)...{来判断,但是为什么是一个循环呢?我的程序只是一个函数,又不会重复的执行,怎么要用循环来判断??还有我的程序中也不一定会sleep啊,如何中断我的F呢?
ExecutorService Future
对解决这个需求有所帮助,
不过since jdk1.5
当线程处于其它状态,比如努力干活,或虽然阻塞但不能被中断(比如一些IO操作),这时线程的中断状态位会被置位,剩下的事情就依赖线程自己的处理了,也就是说线程需要自己抽空来看这个标志位,如果不看的话,别人就没法打断你的运行了。
这就我的线程调用的是用户函数,该用户函数不知道会怎样,更不会去查看这个标志,所以应该怎么处理这种情况呢?
不过这个API已经不推荐使用了,强制杀死线程可能导致同步问题,因为机制不一样,有些资源不会被释放。现在用interrupt() API的目的是保证线程的资源是以java的方式处理的,而不是被native代码处理
* @param args
*/
public static void main(String[] args) {
test a = new test();
p(a);
p(a);
a.start();
p(a);
p(a);
p(a);
// a.stop(); <=== 这里是尝试用各种方法终端线程的地方
// a.interrupt();
p(a);
p(a);
p(a);
p(a);
p(a);
p(a);
p(a);
p(a);
p(a);
p(a);
p(a);
p(a);
p(a); } static long ts = System.currentTimeMillis(); private static void p(test a) {
System.out.println(System.currentTimeMillis() - ts
+ ": Thread.isAlive=" + a.isAlive());
try {
Thread.sleep(300);
} catch (InterruptedException e) {
}
} static class test extends Thread {
public void run() {
System.out.println("I'm running");
sleepAnyWay(1000);
System.out.println("I'm running again");
sleepAnyWay(1000);
System.out.println("I'm gonna to quit");
sleepAnyWay(1000);
} // 这个函数模拟线程中的用户函数把 interrupt异常吃掉的情况
void sleepAnyWay(long ts) {
try {
Thread.sleep(ts);
} catch (InterruptedException e) {
}
}
}
}不尝试结束线程,直接执行的结果如下:0: Thread.isAlive=false
313: Thread.isAlive=false
610: Thread.isAlive=true
I'm running
907: Thread.isAlive=true
1219: Thread.isAlive=true
1516: Thread.isAlive=true
I'm running again
1813: Thread.isAlive=true
2110: Thread.isAlive=true
2422: Thread.isAlive=true
I'm gonna to quit
2719: Thread.isAlive=true
3016: Thread.isAlive=true
3313: Thread.isAlive=true 《======= 线程运行结束后退出
3626: Thread.isAlive=false
3922: Thread.isAlive=false
4219: Thread.isAlive=false
4516: Thread.isAlive=false
4829: Thread.isAlive=false
5126: Thread.isAlive=false
用 a.interrupt(); 尝试结束线程的运行结果如下:
16: Thread.isAlive=false
313: Thread.isAlive=false
610: Thread.isAlive=true
I'm running
907: Thread.isAlive=true
1219: Thread.isAlive=true
1516: Thread.isAlive=true
I'm running again
1813: Thread.isAlive=true
2110: Thread.isAlive=true
2422: Thread.isAlive=true
I'm gonna to quit
2719: Thread.isAlive=true
3016: Thread.isAlive=true
3313: Thread.isAlive=true
3625: Thread.isAlive=false 《===== 因为异常被用户函数吃掉,所以interrupt无法结束线程,还是直到
运行结束后退出
3922: Thread.isAlive=false
4219: Thread.isAlive=false
4516: Thread.isAlive=false
4829: Thread.isAlive=false
5126: Thread.isAlive=false
用 stop 结束线程的结果如下:0: Thread.isAlive=false
297: Thread.isAlive=false
594: Thread.isAlive=true
I'm running
906: Thread.isAlive=true
1203: Thread.isAlive=true
1500: Thread.isAlive=true
1797: Thread.isAlive=false <=== p(a)调用3此后,调用stop, 线程确实结束了,虽然异常还是会被用
户函数吃掉
2109: Thread.isAlive=false
2406: Thread.isAlive=false
2703: Thread.isAlive=false
3000: Thread.isAlive=false
3312: Thread.isAlive=false
3609: Thread.isAlive=false
3906: Thread.isAlive=false
4203: Thread.isAlive=false
4516: Thread.isAlive=false
4813: Thread.isAlive=false
5109: Thread.isAlive=false