Lorsque vous consommez les valeurs d'une file d'attente dans une boucle infinie - qu'est-ce qui serait plus efficace:
1) Blocage sur la file d'attente jusqu'à ce qu'une valeur soit disponible via take ()
while (value = queue.take()) { doSomething(value); }
2) Dormir pendant n millisecondes et vérifier si un article est disponible
while (true) {
if ((value = queue.poll()) != null) { doSomething(value); }
Thread.sleep(1000);
}
Le blocage est probablement plus efficace. En arrière-plan, le thread qui appelle initialement take()
se met en veille s'il n'y a pas d'élément disponible, laissant ainsi les autres threads faire ce qu'ils doivent faire. Les méthodes qui ajoutent des éléments à la file d'attente réactiveront les threads en attente lorsqu'un élément est ajouté. Ainsi, vous passerez un minimum de temps à rechercher continuellement dans la file d'attente la disponibilité d'un élément.
Soyez prudent lorsque vous utilisez take()
. Si vous utilisez take()
à partir d’un service et que le service dispose d’une connexion à la base de données.
Si take()
est renvoyé après l'expiration du délai de connexion obsolète, une exception de connexion obsolète sera lancée.
Utilisez l'interrogation pour le temps d'attente prédéfini et ajoutez une vérification nulle pour l'objet renvoyé.