Il thread Java attende e notifica
-
05-07-2019 - |
Domanda
Ho due discussioni. Il thread A sta estraendo alcuni elementi dalla coda e il thread B sta aggiungendo alcuni elementi alla coda.
Voglio che il thread A vada a dormire quando la coda è vuota.
Quando il thread B aggiunge qualche elemento alla coda, dovrebbe assicurarsi che il thread A funzioni. Come può essere fatto in Java?
Soluzione
Utilizza un BlockingQueue
, ovvero:
Un
Queue
che supporta inoltre operazioni che attendono che la coda diventi non vuota durante il recupero di un elemento e in attesa che lo spazio diventi disponibile nella coda durante la memorizzazione di un elemento.
Seriamente, non provare a reinventare la ruota qui.
(Se devi utilizzare wait / notification, leggi questo tutorial . Ma risparmia il dolore, per favore!)
Altri suggerimenti
Ecco alcuni dettagli:
import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();
Questo è tutto ciò che c'è da fare con le nuove funzionalità di threading di Java. Executor è un pool di thread con al suo interno alcuni SomeNumberOfThreads. È alimentato da una coda di blocco. Tutti i thread dormono a meno che non ci sia lavoro da fare. Quando si inserisce un oggetto Runnable nella coda utilizzando il metodo execute (), l'oggetto Runnable rimane nella coda fino a quando non è disponibile un thread per elaborarlo. Quindi, viene chiamato il metodo run (). Infine, il metodo shutdownNow () segnala lo spegnimento di tutti i thread nel pool.
Ora è molto più semplice di prima.
(Ci sono molte varianti su questo, come pool con numero minimo e massimo di thread o code che hanno dimensioni massime prima che i thread che chiamano execute () si blocchino.)