Thread Java attendre et notifier
-
05-07-2019 - |
Question
J'ai deux threads. Le thread A extrait certains éléments de la file d'attente et le thread B ajoute des éléments à la file d'attente.
Je veux que le sujet A se mette en veille 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?
La solution
Utilisez un BlockingQueue
, qui est:
Une
File d'attente
qui prend également en charge les opérations qui attendent que la file d'attente devienne non vide lors de la récupération d'un élément et qui attendent que de l'espace soit 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 devez utiliser wait / notify, lisez ce tutoriel . Mais épargnez-vous s'il vous plaît!)
Autres conseils
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 ya à faire avec les nouvelles fonctionnalités de thread de Java. Executor est un pool de threads contenant des unsNumberOfThreads. Il est alimenté par une file d'attente bloquante. Tous les fils 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 reste 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 qu'avant.
(Il existe de nombreuses variations à ce sujet, tels que les pools avec un nombre minimal et maximal de threads, ou les files d'attente ayant une taille maximale avant que les threads appelant execute () ne bloquent.)