多线程的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);
}

 

posted @ 2023-03-08 12:47  B站读研  阅读(153)  评论(0)    收藏  举报