美文网首页
线程的中断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.

    相关文章

      网友评论

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

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