java 多线程 线程打断inerrupt ,线程结束
线程打断inerrupt
inerrupt() //设置打断标记位 其实就是告诉jvm 我想要打断这个线程,但是是否打断什么时候打断jvm 说了算
isInerrupt() //是否被打断过 查询标记位
static inerrupted() //返回当前线程是否被打断过,并重制打断标记 true-> false
- 当对 sleep /wait/join 的线程进行打断后,jvm 会抛出异常inerruptedException
- 解决方法是在程序中手动catch 这个异常,由程序员决定如何处理这个异常/忽略,当抛出这个异常后,java会默认吧打断标记位复位。
- lock 或者 synchronized是不会被打算的,如果想打断 需要使用
reentrantLock.lockInterruptibly()
如何结束一个线程
如何优雅的结束一个线程
- 调用stop 方法。(这个方法已经被弃用,不推荐使用,因为容易产生数据不一致的问题,他比较粗暴,如果stop 时有锁,他会直接把所有锁都释放掉)
- suspend (暂停)/ resume(恢复)这两个方法也废弃了原因和stop 一样。
- 声明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;
}
- interrupt 原来和 volatile 类似 在线程里判断是否被标记中断,标记了就退出。