多线程interrupt()方法
interrupt()方法:配合isInterrupted()方法可以合理打断线程,让线程处理好事务后停止。
打算一个非阻塞状态的线程效果
public class test {
public static void main(String[] args) {
Runnable r=()->{
while (true) {
boolean interrupted = Thread.currentThread().isInterrupted();
if (interrupted){
System.out.println("料理后事");
break;
}
}
};
Thread t1=new Thread(r);
t1.start();
System.out.println("打断前:"+t1.isInterrupted());
try {
Thread.sleep(3500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
t1.interrupt();
System.out.println("打断后:"+t1.isInterrupted());
}
- 打断前是false,打断后为true
这里说明打断非阻塞线程,打断标记会变为true
打断阻塞中的线程会有什么效果呢?改一下代码再来试试。
public class test {
public static void main(String[] args) {
Runnable r=()->{
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
boolean interrupted = Thread.currentThread().isInterrupted();
if (interrupted){
System.out.println("料理后事");
break;
}
}
};
Thread t1=new Thread(r);
t1.start();
System.out.println("打断前:"+t1.isInterrupted());
try {
Thread.sleep(3500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
t1.interrupt();
System.out.println("打断后:"+t1.isInterrupted());
}
在while循环中,让线程每循环一次就睡眠一秒,保证在睡眠时打断它。
这次线程也被打断,但是没有将打断标记改为true。
总结:
interrupt()不会清除打断标记
如果线程在阻塞中被打断,会抛出InterruptedException异常,如果直接把这个异常向外抛出,就会导致线程终止,而如果捕获了这个异常,自己处理,就不会导致线程终止
打断sleep,wait,join的线程会抛出异常,isInterrupted()获取打断状态为false
可以利用isInterrupted()方法获取打断状态合理打断线程(当某个线程执行了interrupt方法,打断状态则为真)
可以打断lockSupport.park()状态下的线程,打断标记为true是再次park不会生效