Java中断

背景

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")));
        }
    }
}
Java中断_第1张图片
image.png

你可能感兴趣的:(Java中断)