如何中断线程
1、另外线程调用此线程对象的interrupt()方法,通知线程应该中断了。
(1)果线程处于阻塞状态(sleep、wait、join),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。
(2)处于正常活动状态,那么会将该线程的中断标记设置为true。被设置中断标志的线程将继续正常运行,不受影响。
2、需要被调用的线程配合响应中断,正常运行任务时,进程检查本线程的中断标志位,如果被设置了中断标志就做出相应动作。
public class InterruptDemo {
public static void main(String[] arg) throws InterruptedException {
Thread task = new Thread(() -> {
try {
while (!Thread.currentThread().isInterrupted()) {//检查是否被中断
//do something
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + " loop without interruption");
}
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + " is interrupted");
}
System.out.println(Thread.currentThread().getName() + " after interrupt");
}, "task");
System.out.println(task.getName() + " : " + task.getState());
task.start();
System.out.println(task.getName() + " : " + task.getState());
Thread.sleep(300);
task.interrupt();
System.out.println(task.getName() + " : " + task.getState());
Thread.sleep(300);
System.out.println(task.getName() + " : " + task.getState());
}
}
/*
task : NEW
task : RUNNABLE
task loop without interruption
task loop without interruption
task : TIMED_WAITING
task is interrupted
task after interrupt
task : TERMINATED
*/