Non, les méthodes n'ont pas besoin d'être synchronisés, et vous n'avez pas besoin de définir toutes les méthodes; elles sont déjà en ConcurrentLinkedQueue, simplement les utiliser. ConcurrentLinkedQueue fait tout le verrouillage et le truc que vous avez besoin à l'interne; votre producteur(s) propose des trucs dans la file d'attente, et vos consommateurs sondage pour elle.
Tout d'abord, créez votre file d'attente:
Queue<YourObject> queue = new ConcurrentLinkedQueue<YourObject>();
Maintenant, partout où vous créez votre producteur/consommateur, les objets, les passer dans la file d'attente de sorte qu'ils ont un endroit pour mettre leurs objets (on peut utiliser un setter pour cela, à la place, mais je préfère faire ce genre de chose dans un constructeur):
YourProducer producer = new YourProducer(queue);
et:
YourConsumer consumer = new YourConsumer(queue);
et ajouter des trucs dans votre producteur:
queue.offer(myObject);
et de prendre des trucs dans votre consommateur (si la file d'attente est vide, poll() renvoie la valeur null, alors check it):
YourObject myObject = queue.poll();
Pour plus d'infos, consultez la Javadoc
EDIT:
Si vous avez besoin de bloquer en attente de la file d'attente pour ne pas être vide, vous voudrez probablement utiliser une LinkedBlockingQueue, et utilisez la méthode. Cependant, LinkedBlockingQueue a une capacité maximum (valeur par défaut Entier.MAX_VALUE, qui est plus de deux milliards de dollars) et de ce qui peut ou peut ne pas être appropriée selon votre cas.
Si vous n'avez qu'un seul thread mettre des trucs dans la file d'attente, et un autre thread de prendre des choses de la file d'attente, ConcurrentLinkingQueue est probablement excessif. C'est plus pour quand vous pouvez avoir des centaines ou même des milliers de threads d'accéder à la file d'attente en même temps. Vos besoins vont probablement être atteint en utilisant:
Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
Un avantage de cela est que, il bloque sur l'instance (file d'attente), de sorte que vous pouvez synchroniser sur la file d'attente afin d'assurer l'atomicité de composite de l'exploitation (comme expliqué par Jared). Vous NE pouvez pas faire cela avec un ConcurrentLinkingQueue, puisque toutes les opérations sont effectuées SANS verrouillage de l'instance (à l'aide de java.util.de façon concomitante.atomique variables). Vous n'aurez PAS besoin de faire cela si vous voulez bloquer alors que la file d'attente est vide, parce que poll() renvoie simplement la valeur null alors que la file d'attente est vide, et poll() est atomique. Vérifiez pour voir si poll() renvoie la valeur null. Si elle le fait, wait(), puis essayez à nouveau. Pas besoin de le verrouiller.
Enfin:
Honnêtement, j'aimerais utiliser un LinkedBlockingQueue. Il est encore overkill pour votre application, mais les chances sont qu'il sera beau travail. Si elle n'est pas assez performant (PROFIL!), vous pouvez toujours essayer quelque chose d'autre, et cela signifie que vous n'avez pas à traiter avec TOUT synchronisé trucs:
BlockingQueue<YourObject> queue = new LinkedBlockingQueue<YourObject>();
queue.put(myObject); // Blocks until queue isn't full.
YourObject myObject = queue.take(); // Blocks until queue isn't empty.
Tout le reste est le même. Mettre probablement ne bloquera pas, parce que vous ne sont pas susceptibles de mettre deux milliards d'objets dans la file d'attente.