背景
Java線程除非線程本身愿意砌些,否則無法提前終止,為了解決線程提前終止的問題青自,引入了中斷機(jī)制葫隙。
線程自能只能自我中斷栽烂,不能其他線程中斷
流程
幾個(gè)方法
- void interrupt(): 設(shè)置中斷標(biāo)志位,通知線程自中斷了恋脚。若線程處于運(yùn)行和非中斷狀態(tài)腺办,那么也是僅僅設(shè)置一個(gè)標(biāo)志位成true而已。
- interrupted(): 測(cè)試線程的狀態(tài)位糟描,并重置中斷標(biāo)志(false)
- boolean isInterrupted() 判斷中斷標(biāo)志位菇晃。
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();
//設(shè)置中斷狀態(tài)為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("進(jìn)入循環(huán)前:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//synchronize是不可中斷的
synchronized (Task.class){ }
System.out.println(Thread.currentThread()+ " 獲取到鎖結(jié)束");
//Thread線程狀態(tài)為可中斷
while (true){
try {
//休眠之前/休眠中只要中斷標(biāo)志位為true,均可被中斷
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
//中斷結(jié)束
break;
}
};
//響應(yīng)中斷之后蚓挤,中斷標(biāo)志位會(huì)被重置
System.out.println(Thread.currentThread().isInterrupted() + " 循環(huán)結(jié)束" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
}
image.png