今天笔者学习了中断线程interrupt的方式,故在此分享下,话不多说直接上代码
public class InterruptDemo02 implements Runnable{
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()){ //false
try {
TimeUnit.SECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
//可以不做处理,
//继续中断 ->
Thread.currentThread().interrupt(); //再次中断
//抛出异常。。
}
}
System.out.println("processor End");
}
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(new InterruptDemo02());
t1.start();
Thread.sleep(1000);
t1.interrupt(); //有作用 true
//Thread.interrupted() ;//复位
}
}
看上诉代码,本文主要介绍下线程的interrupt()方法,线程调用isInterrupted()默认值为false,调用interrupt()后即把值设置为true,即可结束线程中的while循环。
interrupt()的作用
1、设置一个共享变量的值 true
2、唤醒处于阻塞状态下的线程。
针对第二点,使线程阻塞的方法sleep、wait、join都会抛出一个受检异常InterruptedException,这里的受检异常是在线程调用interrupt()方法时会进入catch,进入后会自动复原当前共享变量,即while循环还是不会结束,需要在catch中根据情况处理后续,如调用Thread.currentThread().interrupt();再次中断或者抛出异常中断当前线程等。
以下是另外一种基于volatile中断线程的方式
public class InterruptDemo03 implements Runnable{
static volatile boolean interrupt=false;
@Override
public void run() {
while(!interrupt){
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.currentThread().join();
} catch (InterruptedException e) {
e.printStackTrace();
}
;
}
public static void main(String[] args) {
interrupt=true;
}
}
java线程停止最直接的方法是stop(),但是stop不是线程正确停止的方式,因为stop会忽略线程当前的状态而强行停止线程
以上即是笔者分享的正确中断java线程的两种优雅的方式