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

线程的中断interrupt()方法

作者: 叫我胖虎大人 | 来源:发表于2019-08-13 19:04 被阅读0次

线程的6个状态

  • 新建(New):创建后尚未启动的线程的状态
  • 运行(Runnable):包含Running和Ready
  • 无期限等待(Waitting):不会分配CPU执行时间,需要显式唤醒
  • 期限等待(Timed Waitting):在一定时间后会由系统自动唤醒
  • 阻塞(Blocked):等待获取排它锁
  • 结束(Terminated):已终止线程的状态,线程已经结束执行

已经抛弃中断方法

  • 通过调用stop()方法停止线程
  • 通过调用suspend()和resume()方法

原因:调用上述的方法会立即停止调用该方法的线程,会导致线程清理问题.此外,被通知的线程会立即释放锁,造成数据的不同步.

目前的使用方法

  • 调用interrupt(),通知线程应该中断了
    • 1.如果线程处于被阻塞状态,那么该线程将立即退出被阻塞状态,并且抛出一个InterrupedException异常.
    • 2.如果线程初一正常活动状态,那么会将该线程的中断标志设置为true.被设置中断标志的线程将继续中场运行,不受影响.
  • 需要被调用的线程配合中断
    • 1.在正常运行任务时,经常检查本线程的中断标志,如果被设置了中断标志就自行停止线程.

注意:调用interrupt()方法并不会使得线程中断,而是使得线程的中断标志置为true


代码示例

public class InterruptDemo {
    public static void main(String[] args) throws InterruptedException {
        Runnable interruptTask = new Runnable() {
            int i = 0;
            @Override
            public void run() {
                try {
                    //在正常运行任务时,经常进行本线程的中断标志,如果被设置了终端标志就自行停止线程
                    while (!Thread.currentThread().isInterrupted()){
                        //休眠100ms
                        Thread.sleep(100);
                        i++;
                        System.out.println(Thread.currentThread().getName() + " (" + Thread.currentThread().getState() + ") loop " + i);
                    }
                }catch (InterruptedException e){
                    //在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)
                    System.out.println(Thread.currentThread().getName() + " (" + Thread.currentThread().getState()
                                        + ") catch InterruptedException.");
                }
            }
        };
        Thread t1 = new Thread(interruptTask,"t1");
        System.out.println(t1.getName() +" ("+t1.getState()+") is new.");

        // 启动“线程t1”
        t1.start();
        System.out.println(t1.getName() +" ("+t1.getState()+") is started.");

        // 主线程休眠300ms,然后主线程给t1发“中断”指令。
        Thread.sleep(300);
        t1.interrupt();
        System.out.println(t1.getName() +" ("+t1.getState()+") is interrupted.");

        // 主线程休眠300ms,然后查看t1的状态。
        Thread.sleep(300);
        System.out.println(t1.getName() +" ("+t1.getState()+") is interrupted now.");
    }
}

运行结果

t1 (NEW) is new.
t1 (RUNNABLE) is started.
t1 (RUNNABLE) loop 1
t1 (RUNNABLE) loop 2
t1 (TIMED_WAITING) is interrupted.
t1 (RUNNABLE) catch InterruptedException.
t1 (TERMINATED) is interrupted now.

相关文章

  • java线程相关

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

  • interrupt、interrupted和isInterrup

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

  • Thread

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

  • 多线程基础

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

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

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

  • 线程中断Thread的interrupt()方法

    关于interrupt()方法的介绍 本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,...

  • 关闭线程

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

  • 线程 interrupt() 中断

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

  • 8.3 线程控制

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

  • JAVA并发编程(三)线程协作与共享

    1. 线程中断 java线程中断是协作式,而非抢占式 1.1. 线程中断相关方法 interrupt()将线程的中...

网友评论

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

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