王磊的个人技术记录 王磊的个人技术记录

记录精彩的程序人生

目录
java线程中断interrupted 方法
/  

java线程中断interrupted 方法

stop()方法在现在JDK中不推荐使用,原因是stop()方法过于暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题

在使用线程中,如果需要中断线程,不建议使用在线程内部定义一个Boolean 然后在外边改变它的值的方式。

因为这种方式,如果线程中存在 wait或者sleep等 会被操作系统挂起的方法,即使在外部改变了Boolean的值,线程也不会感知到。

如果有这种需求建议使用线程的interrupted 方法,然后在线程内部调用 isInterrupted判断是否被中断。

isInterrupted有两个方法,一个是isInterrupted方法,这种的不会将interrupted 的值重置为false

还有一种是静态的Thread.interrupted方法,这种的会将interrupted 的值重置为false

public static void main(String[] args) throws InterruptedException {    MyThread myThread = new MyThread();    myThread.start();    Thread.sleep(5000);    myThread.interrupt();}private static class MyThread extends Thread {    @Override    public void run() {        String threadName = Thread.currentThread().getName();        System.out.println("1 interrupt is" + isInterrupted());        while (!Thread.interrupted()) {            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                /**                 *  如果线程处于挂起状态时收到了interrupt信号,会抛出一个InterruptedException异常,                 * 并且重置interrupt,此时我们在捕获这个异常之后可以手动的设置interrupt,从而使得                 * 下次循环时判断到已经被中断了,退出线程。                 * 这样的好处是,不会像调用stop一样,直接中断,导致线程中中断位置之后的代码得不到                 * 运行,而导致的结果跟预期不一样。                 */                interrupt();                e.printStackTrace();            }            System.out.println("2 interrupt is" + isInterrupted());        }    }}

如果用的不是extends Thread 方式创建线程,而是使用的implements Runable方式,可以使用

Thread.currentThread().sInterrupted()代替。


标题:java线程中断interrupted 方法
作者:wanglei03
地址:https://wangleijava.com/articles/2019/12/05/1575550336681.html