多线程的interrupt()方法、park和unpark
java中的interrupt方法,主要作用为中断指定线程,该中断并非是直接打断,而是将线程的中断标志设置为1,当线程执行到sleep、wait方法陷入的阻塞状态,则进行中断,抛出interruptException异常,但若是线程进入获取锁失败后的阻塞状态,则不会中断,除非遇到sleep、wait等命令才会进入中断,调用锁对象的wait方法可以由中断处理,interrupt是由一个线程调用来中断另一个线程的阻塞状态,使得其重新进入cpu分配
park和unpark都来源于sun.misc.Unsafe类,其中,park有两种重载方法,一种是park()无参构造,另一种的park(object blocker)带有blocker的构造方法,blocker的park的一个字段,作为getblocker的返回值,并且在park(object blocker)中会设置两次,如下图所示,当使用这两个方法时,park表示对当前的线程进行阻塞,而unpark需要传入线程对象,表示要解锁哪一个线程,其机制在于线程会维护一个prime,其只有01两个取值,当park时置为0,unpark置为1,无论连续unpark多少次都是1,而interrut是设置一个中断标志,当一个线程已经使用park阻塞后,可以通过interrupt进行中断,从而唤醒进程。
public static void park(Object blocker) { // 获取当前线程 Thread t = Thread.currentThread(); // 设置Blocker setBlocker(t, blocker); // 获取许可 UNSAFE.park(false, 0L); // 重新可运行后再此设置Blocker setBlocker(t, null); }
浙公网安备 33010602011771号