Что делает JavaLangAccess.blockedOn (Thread t, Interruptible b)? - PullRequest
1 голос
/ 17 декабря 2011

Из общедоступного javadoc:

void blockedOn(Thread t, Interruptible b)

Установить поле блокировщика потока.

Я использовал этот метод во время исследования java nio, в частности, исходного кода AbstractInterruptibleChannel

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Если вы посмотрите на OpenJDK, он вызывает

/* The object in which this thread is blocked in an interruptible I/O
 * operation, if any.  The blocker's interrupt method should be invoked
 * after setting this thread's interrupt status.
 */
private volatile Interruptible blocker;
private Object blockerLock = new Object();

/* Set the blocker field; invoked via sun.misc.SharedSecrets from java.nio code
 */
void blockedOn(Interruptible b) {
synchronized (blockerLock) {
    blocker = b;
}
}

Используется для запуска действия при прерывании потока.

0 голосов
/ 17 декабря 2011

Кажется, я нашел ответ в java.lang. Исходный код темы (Oracle / Sun JVM):

/* The object in which this thread is blocked in an interruptible I/O
 * operation, if any.  The blocker's interrupt method should be invoked
 * after setting this thread's interrupt status.
 */
private volatile Interruptible blocker;
private Object blockerLock = new Object();

/* Set the blocker field; invoked via sun.misc.SharedSecrets from java.nio code
 */
void blockedOn(Interruptible b) {
    synchronized (blockerLock) {
         blocker = b;
    }
}
public void interrupt() {
    if (this != Thread.currentThread())
        checkAccess();

    synchronized (blockerLock) {
        Interruptible b = blocker;
        if (b != null) {
        interrupt0();        // Just to set the interrupt flag
        b.interrupt();
        return;
        }
    }
    interrupt0();
}

Так поправьте меня, если я ошибаюсь, мои выводы:

  • Прерывание - это просто обратный вызов для события прерывания потока
  • Присоединить конкретный прерываемый экземпляр к конкретному классу возможно только с помощью следующего кода: sun.misc.SharedSecrets.getJavaLangAccess (). Заблокирован (threadInstance, intrInstance);
...