美文网首页
线程 interrupt() 中断

线程 interrupt() 中断

作者: gczxbb | 来源:发表于2019-05-11 19:52 被阅读0次

一、正常运行状态的线程 interrupt() 中断

Thread 类 interrupt() 方法,一个线程正常运行时(非休眠),调用线程对象 interrupt() 方法,线程执行既不会停止,也不会抛出异常,仅设置一个中断标志,线程继续执行,直到遇到休眠时,抛出异常。

final Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        try {
            while (true) {
                System.out.println("thread running loop");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("thread end!");
    }
});
thread.start();
try {
    Thread.sleep(2000);
} catch (Exception e) {
    e.printStackTrace();
}
thread.interrupt();

一个 while 循环线程,主线程调用 Thread 对象 interrupt() 方法时,System 打印未停止,说明线程执行未受到影响。

添加判断条件成 isInterrupted() 方法。

while (!Thread.currentThread().isInterrupted()) {
    System.out.println("thread running loop");
}

一旦 interrupt() 被中断,线程执行结束。

二、休眠状态的线程 interrupt() 中断

线程正在 休眠阻塞 sleep() 方法,调用线程对象 interrupt() 方法,抛出异常,进入 InterruptedException 代码块执行。

final Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        try {
            while(true) {
                Thread.sleep(10000);
            }
        } catch (Exception e) {
            System.out.println("thread exception!");
            e.printStackTrace();
        }
        System.out.println("thread end!");
    }
});
thread.start();
try {
    Thread.sleep(2000);
} catch (Exception e) {
    e.printStackTrace();
}
thread.interrupt();

主线程调用 Thread 对象的 interrupt() 方法,线程捕获到中断,立即抛出异常,结束线程。
wait() 方法休眠,同样会抛出 InterruptedException 异常。

三、Thread 的 interrupted 中断状态

Thread 类的 interrupted() 方法,检查当前线程中断状态,静态类方法,仅获取调用他的线程的中断状态,不在特定的线程对象中使用。

final Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        try {
             while (!Thread.interrupted()) {
                    System.out.println("thread running loop");
             }
             System.out.println(Thread.interrupted());
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("thread end!");
        }
    });
    thread.start();
    try {
        Thread.sleep(2000);
    } catch (Exception e) {
        e.printStackTrace();
    }
    thread.interrupt();
}

线程对象调用 interrupt() 方法,设置线程中断标志,interrupted() 方法查询,退出循环。

退出后,再次打印 interrupted() 方法返回值,结果是 无中断标志。说明调用 interrupted() 方法后,自动重置中断状态。

线程对象的 isInterrupted() 方法 查询,结果未 重置中断状态,这就是二者的区别。


任重而道远

相关文章

  • 线程相关(六)interrput 和 yield

    interrupt调用interrupt(),通知线程应该中断了。这个很有意思,是通知线程应该中断,而不是中断线程...

  • 多线程基础

    多线程基础总结 一、线程中断 interrupt方法用来请求终止线程。 1. interrupt置位中断标志位 当...

  • Thread

    Thread-中断 interrupt() interrupt()用于中断线程,调用该方法的线程的状态将被置为"中...

  • 线程中断interrupt()、interrupted()和is

    interrupt() thread.interrupt(),该方法用于中断Thread线程,此线程并非当前线程,...

  • java线程相关

    中断一个正在运行的线程 中断阻塞线程的方法 我们调用线程对象的interrupt()方法时会产生Interrupt...

  • interrupt、interrupted和isInterrup

    1.interrupt() interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注...

  • 8.3 线程控制

    线程中断 方法:void interrupt():中断线程(本质没有中断操作,只是给线程对象加了个标记,设置其中断...

  • 线程 interrupt() 中断

    一、正常运行状态的线程 interrupt() 中断 Thread 类 interrupt() 方法,一个线程正常...

  • 关闭线程

    终止线程 stop方法,已经被弃用,无法预期 interrupt interrupt方法其作用是中断此线程(此线程...

  • Java线程Thread之interrupt中断解析

    这一篇我们说说Java线程Thread的interrupt中断机制。 interrupt之中断状态标记 inter...

网友评论

      本文标题:线程 interrupt() 中断

      本文链接:https://www.haomeiwen.com/subject/lzltaqtx.html