如果一个线程,调用了sleep, 那么它就会进入block 状态,如果期间调用了interrupt,就会抛出个异常。
那么是不是说,如果出现了异常,这个线程是不是肯定就终止了?
因为一般情况run()是这样写的
run(){
try{XXX}
catch(){}
}
这时如果出现异常,程序就跳到catch部分了,那么执行完catch,run也就执行完了,这样整个线程就结束了。有没有这样的可能
run(){while(true){
try{XXX}
catch(){}
}
}
在catch后,仍然不退出run?
那么是不是说,如果出现了异常,这个线程是不是肯定就终止了?
因为一般情况run()是这样写的
run(){
try{XXX}
catch(){}
}
这时如果出现异常,程序就跳到catch部分了,那么执行完catch,run也就执行完了,这样整个线程就结束了。有没有这样的可能
run(){while(true){
try{XXX}
catch(){}
}
}
在catch后,仍然不退出run?
如果捕获了这个异常,而在 catch 块中写上:Thread.currentThread().interrupt(); 这句的话,那循环会继续下去,由于在 catch 块中再次请求中断,因此在每个的阻塞方法都不会进行阻塞。你提供的示例代码是有危险性的,有当前线程收到中断请求的话说明该线程应中断了,而不是忽略不管。应该改成这样:try {
while(true) {
xxxx; // 这里含有会抛出 InterruptedException 的方法
}
} catch (InterruptedException e) {
xxxx; // 进行清扫工作结束线程的运行
Thread.currentThread().interrupt(); // 为了保险起见再次请求中断一次
}对于大多数的 Java 开发人员来说,基本上都会无视 java.lang.InterruptedException 这个异常,如果向外抛出的话也就罢了,最讨厌的就是直接 catch 住然后什么都不做,像这样!xxxx; // 一堆语句
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
xxx; // 再一堆语句
如果是这样,有两个办法可行
①设置一个共享boolean变量
boolean flag = true;public void run() {
while(flag) {
@#$@#$@#$@#$@#
}
}
只要将flag设置成 false就可以跳出死循环了
②while(true) {
try {
@#$@#$@#$$
Thread.sleep(1); // 象征性的睡(有时候是必须得睡)
} catch(InterruptedException e) {
break; // break 之后跳出while循环
}
}
向中断这个while循环的时候只要在主线程中调用一下 t.interrupt()就可以让这个t的run()方法结束了③还有其他的办法请楼下的兄弟们来补充 ^_^
有个问题没有理解明白,你说“如果捕获了这个异常而不处理的话,当前线程不会被中断,会继续执行下去”,你是说如果run()中是这样写的:
run(){
xxxx; // 一堆语句
try { Thread.sleep(5000); }
catch (InterruptedException e) { e.printStackTrace(); }
}当这个线程在sleep时,即使发生了interrupt,由于catch什么也没做,所以这个线程不会被终止?
1 都走到catch了,不终止还往哪里走?!!! .你的线程是执行完run方法就退出的
2 1)以前的JDK版本是用interrupt status的,就是你的run里面有个while循环,假设可以运行好久,那么它可以检测自己线程 的interrupt status,如果为true,就跳出循环,结束自己,2)近些年jdk版本高了推荐像6楼一样用flag来搞3)还有一种很可古老的方法是用suspend,resume,不过已经deprecate的,因为它们不释放锁
4) 如果在join,sleep,wait等方法中,本线程接收到其它线程调用的interrupt()方法,那么本线程会产生InterruptedException异常,并清除中断标志.所以你在catch块里永远检测不到中断标志
3 这是月经贴了,哎...楼主要多查资 料的好,还是容易理解的