2009-11-15 4 views
0

Je passe par un livre Java 6. Un extrait de code exemple est donné ci-dessous du chapitre Threads, où je besoin d'une clarificationAprès l'attente ne doit pas être thread dans l'état de blocage plutôt que l'état exécutable?

synchronized(a){ //The thread gets the lock on 'a' 
a.wait(2000);// Thread releases the lock and waits for notify only for maximum of two seconds, then goes back to runnable state 
//The thread reacquires the lock 
//More instructions here 
} 

Maintenant, mon doute est, au bout de 2 secondes de temps d'attente, de poursuivre l'exécution ultérieure de code, le code ci-dessus nécessiterait le verrou sur l'objet 'a' et il y a de bonnes chances que l'autre thread (qui est supposé appeler notify() sur a) puisse déjà contenir un verrou dessus.

Le thread ne devrait donc pas passer à l'état de blocage après 2 secondes d'attente, au lieu de l'état Runnable comme mentionné ci-dessus dans les commentaires (dans la ligne n ° 2).

Répondre

1

Si un autre thread a le verrou sur l'objet, alors oui, vous avez raison, il attendra. Les javadocs pour l'attente indiquent le comportement suivant lorsque la durée spécifiée est écoulée. "Le thread T est ensuite retiré de l'ensemble d'attente pour cet objet et réactivé pour l'ordonnancement des threads.Il rivalise alors de la manière habituelle avec d'autres threads pour le droit de synchroniser sur l'objet, une fois qu'il a pris le contrôle de l'objet, toutes ses revendications de synchronisation sur l'objet sont restaurées au statu quo ante - c'est-à-dire à la situation au moment où la méthode d'attente a été invoquée "

+0

Dans la déclaration ci-dessus, où il est activé pour la planification des threads "dans la première ligne, cela signifie que c'est l'état Runnable maintenant. Droite? Mais la ligne suivante indique que maintenant elle se termine avec d'autres threads pour le droit de synchroniser (c'est-à-dire pour atteindre le verrou) - Alors cela signifierait le fil - Blocage de l'objet Alors, lequel est correct? Est-ce dans l'état Runnable ou dans l'état Blocking? S'il vous plaît corrigez-moi si je me trompe n'importe où. – Harish

+0

Si aucun autre thread n'avait le verrou, il serait exécutable, mais si quelque chose d'autre avait le verrou, il devrait attendre comme tout le monde. Vous devriez écrire quelques tests pour explorer ce comportement plus loin. –

+0

Merci pour cette info. Je vais essayer quelques exemples comme suggéré – Harish

Questions connexes