ArrayBlockingQueue
est soutenu par un tableau dont la taille ne changera jamais après sa création. Définition de la capacité sur Integer.MAX_VALUE
créerait un grand tableau avec des coûts élevés dans l'espace. ArrayBlockingQueue
est toujours borné.
LinkedBlockingQueue
crée des nœuds dynamiquement jusqu'à ce que capacity
soit atteint. C'est par défaut Integer.MAX_VALUE
. L'utilisation d'une telle capacité n'a aucun coût supplémentaire dans l'espace. LinkedBlockingQueue
est éventuellement délimité.
ArrayBlockingQueue<E>
et LinkedBlockingQueue<E>
sont des implémentations courantes de BlockingQueue<E>
interface.
ArrayBlockingQueue
est soutenu par array
et Queue
impose des ordres comme FIFO
. la tête de file d'attente est l'élément le plus ancien en termes de temps et la queue de la file d'attente est l'élément le plus jeune. ArrayBlockingQueue
est également un tampon limité de taille fixe d'autre part LinkedBlockingQueue
est une file d'attente éventuellement limitée construite au-dessus des nœuds liés.
L'argument facultatif du constructeur lié à la capacité sert à empêcher une expansion excessive de la file d'attente car si la capacité n'est pas spécifiée, elle est égale à Integer.MAX_VALUE
.
Lire la suite De ici .
Indice de référence: http://www.javacodegeeks.com/2010/09/Java-best-practices-queue-battle-and.html
ArrayBlockingQueue:
ArrayBlockingQueue est une file d'attente bloquée bornée qui stocke les éléments en interne dans un tableau. Le fait qu'il soit borné signifie qu'il ne peut pas stocker des quantités illimitées d'éléments. Il y a une limite supérieure sur le nombre d'éléments qu'il peut stocker en même temps. Vous définissez la limite supérieure au moment de l'instanciation, et après cela, elle ne peut pas être modifiée.
LinkedBlockingQueue
Le LinkedBlockingQueue conserve les éléments en interne dans une structure liée (nœuds liés). Cette structure liée peut éventuellement avoir une limite supérieure si vous le souhaitez. Si aucune limite supérieure n'est spécifiée, Integer.MAX_VALUE est utilisé comme limite supérieure.
Similitude
ArrayBlockingQueue/LinkedBlockingQueue stocke les éléments en interne dans l'ordre FIFO (First In, First Out). La tête de la file d'attente est l'élément qui a été dans la file d'attente le plus longtemps et la queue du file d'attente est l'élément qui a été dans la file d'attente le plus court.
Différences
L'algorithme Two Lock Queue est utilisé par la mise en œuvre de LinkedBlockingQueue. Ainsi, la prise et la mise en place de LinkedBlockingQueue peuvent fonctionner simultanément, mais ce n'est pas le cas avec ArrayBlockingQueue. La raison de l'utilisation d'un seul verrou dans ArrayBlockingQueue est que ArrayBlockingQueue doit éviter d'écraser les entrées afin de savoir où se trouvent le début et la fin. Un LinkedBlockQueue n'a pas besoin de le savoir car il permet au GC de s'inquiéter du nettoyage des nœuds dans la file d'attente.
L'ajout d'un élément à ArrayBlockingQueue est censé être plus rapide car cela signifie uniquement définir une référence à un élément du tableau d'objets de support, tandis que l'ajout d'un élément à LinkedBlockingQueue signifie créer un Node et définir son élément, En outre, lorsque nous supprimons un élément de LinkedBlockingQueue, le Node devient un déchet qui peut influencer les performances de l'application).
En ce qui concerne la consommation de mémoire, ArrayBlockingQueue contient toujours un tableau d'objets à pleine capacité même lorsqu'il est vide. D'un autre côté, un élément de LinkedBlockingQueue est un Node avec un objet avec 3 champs d'objet.