用户工具


原理概述

  • java线程中的中断只是设置了一个状态位
  • 程序通过轮询线程该状态位,来判断线程是否中断。
    • 如果轮训线程阻塞了(如调用sleep方法),怎么办?
      • 那会在阻塞的地方抛出中断异常(像sleep之类的阻塞操作,内部实现的时候会轮训中断标识位)
      • 如果是wait、sleep以及join三个方法引起的阻塞,那么会将线程的中断标志重新设置为false,并抛出一个InterruptedException;
      • 如果是java.nio.channels.InterruptibleChannel进行的io操作引起的阻塞,则会对线程抛出一个ClosedByInterruptException;
        • InterruptibleChannel包含3个方法begin(),end(),close()。
          • begin(): 该函数注册了一个中断回调方法,假如多个线程同时使用了该InterruptibleChannel对象。其中任意一个线程对他发起了中断信息,都会触发close()方法
          • “业务处理逻辑”: 该过程不可被中断
          • end(): 当“业务处理逻辑”完成后,判断是否有线程发起了中断,并根据情况抛出异常
  • 中断时允许注册回调函数。当调用Thread.interrupt()时,触发回调
        sun.misc.SharedSecrets.getJavaLangAccess().blockedOn(thread,
                new Interruptible() {
                    public void interrupt(Thread thread) {
                        System.out.println("callback for interrupt");
                    }
                }
        );