2010-10-22 6 views
2

Je suis complètement nouveau à Java, mais j'ai besoin urgent de créer une file d'attente et le fil. Je suis confus quelle classe de file d'attente doit être utilisée.[Java]: Quel type de file d'attente utiliser pour mon scénario?

Voici le scénario:

Je dois un fil pour gérer les événements de l'utilisateur à partir de la couche d'application ainsi que des événements de rappel de la couche middleware inférieure. Pour cela, il a été décidé qu'une file d'attente sera maintenue. Les événements seront enregistrés dans cette file d'attente à chaque fois qu'un événement utilisateur ou un événement de rappel se produit. Le thread interroge les événements de la file d'attente et prend les mesures appropriées. La même file d'attente peut être écrite par différentes classes (couche inférieure de l'application &). Par conséquent, quelle file d'attente serait plus sûre, pour s'assurer que le même emplacement n'est pas écrit simultanément par différentes classes?

De même, quelle est la différence de base d'une phrase entre une file d'attente, BlockingQueue et ArrayBlockingQueue et dans quels scénarios chacun doit-il être sélectionné?

Cordialement, kiki

+1

-1 Le filetage est un sujet difficile et peu adapté aux différences d'une phrase. Pardon. – CurtainDog

Répondre

3

Parmi les trois que vous avez énumérés, le seul qui est en fait une classe est ArrayBlockingQueue. Une file d'attente bloquante est différente d'une file d'attente normale en ce sens que, si un objet tente de supprimer l'élément frontal, il suspend l'exécution jusqu'à ce qu'il y ait un élément disponible à supprimer. "BlockingQueue" et "Queue" ne sont que des interfaces; vous ne pouvez pas les instancier. Personnellement, j'utiliserais une LinkedBlockingQueue pour cette application - l'avantage d'utiliser une liste chaînée est qu'il n'y a pas de capacité maximale définie, et l'utilisation de la mémoire diminue au fur et à mesure que vous utilisez cette fonction. la file d'attente diminue.

3

En ce qui concerne la "différence de peu de mots": Queue et BlockingQueue sont des interfaces, tandis que ArrayBlockingQueue est une classe qui implémente l'interface BlockingQueue.

Vous devriez choisir principalement entre ConcurrentLinkedQueue et ArrayBlockingQueue/LinkedBlockingQueue. La première donne une file d'attente illimitée (et non une taille limite), ces dernières fournissent des files d'attente de taille fixe qui attendent qu'un espace soit disponible dans la file d'attente lors du stockage d'un élément.

Comme alternative aux files d'attente + threads, vous pouvez considérer les interfaces Executor et Future à partir du package concurrent, elles peuvent être plus faciles à utiliser pour implémenter le modèle client-serveur.

+0

LinkedBlockingQueue n'est pas limité en taille - c'est une implémentation de liste liée –

+0

Il est et la taille est spécifiée par le constructeur, bien, il peut être Integer.MAX_VALUE :) –

2

Utilisez le niveau supérieur Executors.newSingleThreadExecutor()

+0

Je pense que vous voulez dire Executors.newSingleThreadExecutor() – NamshubWriter

+0

@NamshubWriter - en effet Je le fais, merci pour cela – CurtainDog

2

Pour votre scénario, ce que vous avez besoin est un fil file d'attente sûr, comme ConcurrentLinkedQueue. En ce qui concerne votre autre question sur Queue et BlockingQueue. Il existe essentiellement les types de mises en œuvre de file d'attente suivantes:

Blocking: blocs jusqu'à ce que l'opération (put(),take() etc.) est possible avec un délai d'attente en option. non bloquante: L'opération se termine instantanément

Bound: a une limite supérieure du nombre d'éléments dans la file d'attente

non liée: Aucune limite sur le nombre d'éléments dans la queue. Quant à ArrayBlockingQueue, il est sauvegardé par un Array tandis qu'un LinkedBlockingQueue est sauvegardé par LinkedList.

Questions connexes