线程打断inerrupt

inerrupt() //设置打断标记位 其实就是告诉jvm 我想要打断这个线程,但是是否打断什么时候打断jvm 说了算
isInerrupt() //是否被打断过 查询标记位
static inerrupted() //返回当前线程是否被打断过,并重制打断标记 true-> false
  • 当对 sleep /wait/join 的线程进行打断后,jvm 会抛出异常inerruptedException
  • 解决方法是在程序中手动catch 这个异常,由程序员决定如何处理这个异常/忽略,当抛出这个异常后,java会默认吧打断标记位复位。
  • lock 或者 synchronized是不会被打算的,如果想打断 需要使用
reentrantLock.lockInterruptibly()

如何结束一个线程

如何优雅的结束一个线程

  1. 调用stop 方法。(这个方法已经被弃用,不推荐使用,因为容易产生数据不一致的问题,他比较粗暴,如果stop 时有锁,他会直接把所有锁都释放掉)
  2. suspend (暂停)/ resume(恢复)这两个方法也废弃了原因和stop 一样。
  3. 声明boolean 的volatile变量,用他来判断是否停止这个线程下面是代码。
private static volatile boolean running = true;

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            while (running) {
                System.out.println("running");
            }
        }).start();
        Thread.sleep(10000);
        running = false;
    }
  1. interrupt 原来和 volatile 类似 在线程里判断是否被标记中断,标记了就退出。