===== 原理概述 =====
* 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");
}
}
);