Question Thread Java attendre et notifier


J'ai deux fils. Le thread A tire des éléments de la file d'attente et le thread B ajoute des éléments à la file d'attente.

Je veux que le thread A s'endorme lorsque la file d'attente est vide.

Lorsque le thread B ajoute un élément à la file d'attente, il doit s'assurer que le thread A fonctionne. Comment cela peut-il être fait en Java?


10
2018-05-05 18:02


origine


Réponses:


Utiliser un BlockingQueue, lequel est:

UNE Queue qui prend également en charge les opérations qui attendent que la file d'attente ne devienne pas vide lors de la récupération d'un élément et que l'espace disponible devienne disponible dans la file d'attente lors du stockage d'un élément.

Sérieusement, n'essayez pas de réinventer la roue ici.




(Si vous doit utiliser wait / notify, read ce tutoriel. Mais épargnez-vous la douleur, s'il vous plaît!)


21
2018-05-05 18:04



Voici quelques détails:

import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();

C'est tout ce qu'il y a à faire avec les nouvelles fonctionnalités de threading de Java. Executor est un pool de threads avec someNumberOfThreads. Il est alimenté par une file d'attente bloquante. Tous les threads dorment sauf s'il y a du travail à faire. Lorsque vous poussez un objet Runnable dans la file d'attente à l'aide de la méthode execute (), l'objet Runnable se trouve dans la file d'attente jusqu'à ce qu'un thread soit disponible pour le traiter. Ensuite, sa méthode run () est appelée. Enfin, la méthode shutdownNow () signale l’arrêt de tous les threads du pool.

C'est beaucoup plus simple maintenant.

(Il existe de nombreuses variantes à ce sujet, telles que les pools avec un nombre minimal et maximal de threads, ou les files d'attente ayant une taille maximale avant que les threads qui appellent execute () ne bloquent.)


2
2018-05-05 18:52