背景
Java线程除非线程本身愿意,否则无法提前终止,为了解决线程提前终止的问题,引入了中断机制。
线程自能只能自我中断,不能其他线程中断
流程
几个方法
- void interrupt(): 设置中断标志位,通知线程自中断了。若线程处于运行和非中断状态,那么也是仅仅设置一个标志位成true而已。
- interrupted(): 测试线程的状态位,并重置中断标志(false)
- boolean isInterrupted() 判断中断标志位。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit;
/**
* @author lixiaowen
* @date 2019/10/30
*/
public class Interrupt {
public static void main(String[] args) {
Task task = new Task();
synchronized (Task.class){
task.start();
//设置中断状态为true
task.interrupt();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("MAIN 线程释放锁");
}
static class Task extends Thread {
public void run() {
System.out.println("进入循环前:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//synchronize是不可中断的
synchronized (Task.class){ }
System.out.println(Thread.currentThread()+ " 获取到锁结束");
//Thread线程状态为可中断
while (true){
try {
//休眠之前/休眠中只要中断标志位为true,均可被中断
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
//中断结束
break;
}
};
//响应中断之后,中断标志位会被重置
System.out.println(Thread.currentThread().isInterrupted() + " 循环结束" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
}
image.png
网友评论