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?

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top