27 votes

Est-il mauvais d'utiliser le polling en Java?

J'ai plusieurs ArrayLists qui fonctionnent comme des files d'attente de données. Chaque file d'attente est lié à un thread qui vérifie si c' ArrayList a certaines données qu'il contient.

 while (array.size == 0) {
    // nothing
 }

 // do stuff with one element of the array
 // remove element from array
 // and call the loop again

J'ai fait des choses similaires dans le système intégré de programmation, mais est-ce sûr d'en Java? Le souci est sur le processus d'alimentation des déchets par l'itération autour de cette boucle while très rapide.

Il pourrait être résolu par l'ajout d' Thread.sleep(100) et de contrôler toutes les 100ms, mais là encore - temps de réponse plus lente.

La question est ai - je besoin d'ajouter que le sommeil ou je ne devrais pas être inquiète?

Toutes les suggestions sur les plus sûres/meilleur système pour vérifier les nouvelles données dans des tableaux?

49voto

assylias Points 102015

Liste de tableaux n'est pas thread-safe collection, donc si un thread ajoute des données à votre liste, et un autre thread tente de récupérer des données à partir de la même liste, vous n'avez aucune garantie que l'autre thread va jamais voir les éléments ajoutés.

Et occupé attente comme ce que vous décrivez de ressources cpu inutilement.

Puisque vous semblez avoir besoin d'une file d'attente, pourquoi n'utilisez-vous pas, comme ArrayBlockingQueue. Il a un take méthode qui permet de bloquer, sans consommation de cycles de PROCESSEUR, jusqu'à ce qu'un élément est ajouté à la file d'attente. Et c'est thread-safe.

11voto

Tudor Points 39539

À moins que le temps que vous devez attendre, c'est très très court, et de faire ainsi un changement de contexte trop cher, je ne voudrais pas utiliser de tourner. Il a certainement les déchets de cycles CPU pour aucune bonne raison.

Vous devez utiliser wait/notify ou quelque autre mécanisme de signalisation de suspendre le fil et de le sortir uniquement lorsque c'est nécessaire.

Allez plus avancée des constructions, il existe des structures de données pour le producteur-consommateur modèles, comme BlockingQueue (choisissez une mise en œuvre):

Une File d'attente qui de plus prend en charge les opérations en attente pour la file d'attente pour devenir non-vide lors de la récupération d'un élément, et attendre pour l'espace d' disponible dans la file d'attente lors du stockage d'un élément.

2voto

RNJ Points 5820

Que diriez-vous d'utiliser quelque chose comme la file d'attente de blocage qui a été publiée dans java 5. Je pense que cela est recommandé maintenant sur attendre / notifier, ce qui peut devenir assez compliqué. Je l'ai utilisé et ça marche bien.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

1voto

Subhrajyoti Majumder Points 20001

java.lang.ArrayList n'est pas du tout sûr pour les threads. Ici, à des fins de mise en file d'attente, c'est sa bonne utilisation BlockingQueue. Il bloque l'appel de thread si la file d'attente est vide sans consommer de CPU. vous pouvez utiliser ArrayBlockingQueue ou LinkedBlockingQueue ou une autre implémentation de file d'attente selon les besoins.

Même vous pouvez l'implémenter avec wait and notifyAll mais il est toujours recommandé d'utiliser la file d'attente de blocage.

1voto

anizzomc Points 149

Au lieu d'utiliser ArrayList, vous pouvez utiliser une collecte Simultanée, permet de dire, par exemple, une ArrayBlockingQueue

ArrayBlockingQueue<YourObject> theQueue;
while(true) {
  YourObject o = theQueue.take();
 //process your object
}

Dans l'autre endroit, où vous remplissez votre file d'attente, vous venez de faire un

theQueue.add(theElement);

Le thread est en attente pour les objets "sommeil" jusqu'à ce qu'il y a un élément. La méthode add réveille le consommer fil.

Vous pouvez lire plus au sujet de cette classe ici: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ArrayBlockingQueue.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X