7
votes

Pourquoi une prioritorielle n'ait-elle pas agir comme une file d'attente?

J'utilise le priorityblockingQueue avec un champ prioritaire. Dans mon test, j'utilise Système # actuel () pour les priorités - les mêmes priorités sont obtenues par l'ordinateur étant si rapide que les millisecondes sont identiques (ou plus que les millisecondes sur un PC ont une marge de PC. erreur).

Lorsque les priorités sont identiques, la file d'attente agit comme si elle est une pile, qui semble étrange. Existe-t-il une alternative à faire de la file d'attente comme s'il s'agit d'une file d'attente normale (c'est-à-dire que la FIFO plutôt que le comportement de Lifo) lorsque les priorités des éléments sont les mêmes?


0 commentaires

4 Réponses :


11
votes

Opérations sur cette classe ne garantit aucune garantie sur la commande d'éléments avec une priorité égale. Si vous devez exécuter une commande, vous pouvez définir des classes ou des comparateurs personnalisés qui utilisent une clé secondaire pour briser les liens des valeurs prioritaires prioritaires.

Le PriorityblockingQuningQueue docs eux-mêmes vous dire cela et comment se déplacer si vous en avez besoin.


5 commentaires

A vu les documents, mais prévu qu'il y aurait déjà une classe d'utilité pour faire une file d'attente, pas une pile. Si je mets la file d'attente, cela devrait aller à l'arrière et sauter la file d'attente si sa priorité plus élevée.


Pourquoi? La plupart des utilisateurs utilisent un priorityblockingqueue avec différentes priorités.


"Pas de garantie sur la commande d'éléments avec une priorité égale." Cela signifie qu'il pourrait agir comme une pile, cela pourrait agir comme une file d'attente, cela pourrait se comporter de manière totalement au hasard, cela pourrait dépendre de ce que c'est mardi ou s'il est ensoleillé à l'extérieur. pas de garanties.


Désolé, ma question était incorrectement formulée, je cherche une alternative qui garantira l'ordre lorsque la priorité est égale (c'est-à-dire une file d'attente à tout moment). Comme une utilité différente de Google ou d'Apache s'il en existe un, et non nécessaire pour créer des classes FIFO avec des numéros Atomic Long SEQ.


Nope, pas alternative. Vous pouvez écrire un wrapper autour de priorityblockingqueue qui fait le atomiclong substantiquement, cependant.



2
votes

Je ne pense pas que la file d'attente prioritaire garantit l'ordre d'obtenir des éléments égaux. Une option est d'avoir la priorité plus complexe - poussez le négatif de la taille de la file d'attente lors de la poussée de l'élément avec sa priorité et de comparer ces valeurs pour des éléments de priorité égaux.


0 commentaires

1
votes

Créez simplement une prioritéBlockingQueue avec votre propre comparateur qui prend du temps de création en compte (voir http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/priorityblockingQueue.html#priorityblockingQueue (int, java.util.cava) ). Vous devrez peut-être modifier vos clés de la simple date à une date de date et de comptoir, où ces derniers seront incrémentés globalement avec chaque création (domaine statique de votre nouvelle classe de clés); Ce n'est pas vraiment fifo mais plutôt créé d'abord d'abord.

ou, il suffit de mettre en place votre propre classe priorkeeuefifo.


0 commentaires

0
votes

Une autre solution consiste à maintenir un compteur dans vos tests que vous utilisez pour la priorité et que vous augmentez sur chaque insertion. De cette façon, votre file d'attente prioritaire aura la FIFO de commander vos tests, mais elle ressemblera à une file d'attente prioritaire arbitraire.


0 commentaires