Question

Je regardais le code source de java.uti.concurrent.locks.AbstractQueuedSynchronizer et la méthode Acquérir () ressemble à quelque chose comme ça -

 public final void acquire(int arg) {
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        Thread.currentThread().interrupt();
}

Pourquoi cela interrompt-il le fil appelant une acquisition ()? S'il y avait une vérification quelque part dans la méthode run () des threads, elle risquait de passer après l'appel de l'acquisition (), ce qui est probablement indésirable et impensé?

Quelqu'un veut-il expliquer pourquoi le code ci-dessus fait cela?

Était-ce utile?

La solution

Si vous lisez la Javadoc pour l'acquisitionQueued , vous remarquerez qu'elle renvoie la valeur true si le thread a été interrompu pendant l'attente. Ainsi, l'appel à selfInterrupt (comme il est appelé dans le code source OpenJDK) consiste à propager l'interruption vers le thread appelant, qui sinon serait avalé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top