Ho più BlockingQueues contenenti messaggi da inviare. È possibile avere meno consumatori delle code? Non voglio fare il giro delle code e continuare a interrogarle (occupato in attesa) e non voglio un thread per ogni coda. Invece, mi piacerebbe avere un thread che si sveglia quando un messaggio è disponibile su una qualsiasi delle code.Code di blocco multiple, utente singolo
risposta
Un trucco che si potrebbe fare è avere una coda di code. Quindi quello che dovresti fare è avere un'unica coda di blocco a cui tutti i thread si iscrivono. Quindi, quando accodati qualcosa in uno dei tuoi BlockingQueues, accoderai anche la tua coda di blocco su questa singola coda. Così si avrebbe qualcosa come:
BlockingQueue<WorkItem> producers[] = new BlockingQueue<WorkItem>[NUM_PRODUCERS];
BlockingQueue<BlockingQueue<WorkItem>> producerProducer = new BlockingQueue<BlockingQueue<WorkItem>>();
Poi, quando si ottiene un nuovo elemento di lavoro:
void addWorkItem(int queueIndex, WorkItem workItem) {
assert queueIndex >= 0 && queueIndex < NUM_PRODUCERS : "Pick a valid number";
//Note: You may want to make the two operations a single atomic operation
producers[queueIndex].add(workItem);
producerProducer.add(producers[queueIndex]);
}
Ora i vostri consumatori possono tutti blocco sul producerProducer. Non sono sicuro di quanto sia preziosa questa strategia, ma realizza ciò che desideri.
Il LinkedBlockingMultiQueue fa quello che stai chiedendo. Non consente al consumatore di bloccare arbitrariamente BlockingQueues, ma è possibile creare "sottocodici" da un'unica "coda multipla" e ottenere lo stesso effetto. I produttori offrono nelle code secondarie e i consumatori possono bloccarsi da soli eseguendo il polling della singola coda multi, in attesa di qualsiasi elemento.
Supporta anche le priorità, ovvero prendendo elementi da alcune code prima di considerarne altri.
Esempio:
LinkedBlockingMultiQueue<Int, String> q = new LinkedBlockingMultiQueue<>();
q.addSubQueue(1 /* key */, 10 /* priority */);
q.addSubQueue(2 /* key */, 10 /* priority */);
LinkedBlockingMultiQueue<Int, String>.SubQueue sq1 = q.getSubQueue(1);
LinkedBlockingMultiQueue<Int, String>.SubQueue sq2 = q.getSubQueue(2);
Quindi è possibile offrire e sondaggio:
sq1.offer("x1");
q.poll(); // "x1"
sq2.offer("x2");
q.poll(); // "x2"
Disclaimer: io sono l'autore della biblioteca.
- 1. C++ - thread e code multiple
- 2. Lettore di scritture multiple free lock singolo
- 3. Code di compilazione multiple in Jenkins
- 4. gitosi: macchine multiple dello stesso utente
- 5. Render blocco singolo in giada
- 6. XML singolo, attività multiple e là prestazioni
- 7. Grafite: serie multiple con un singolo comando
- 8. Sostituzioni multiple Java su un singolo passaggio
- 9. AngularJS - Visualizzazione ng multiple in modello singolo
- 10. Istanze di nodo multiple con un singolo database
- 11. esportazione di tabelle di accesso multiple su XML singolo
- 12. Esci dalla modalità utente singolo
- 13. Opzioni database a utente singolo
- 14. checkout utente singolo in SVN
- 15. singolo SQL SELECT multiple righe di una tabella fila
- 16. Alternative a un singolo elemento <select multiple = "multiple"> per dataset di grandi dimensioni
- 17. Blocco e sblocco risorse con comando singolo
- 18. Decrittografia AES a blocco singolo in Ruby
- 19. Connessione a un'interfaccia utente di blocco socket
- 20. Istogramma Kibana - Linee multiple parametrizzate su un singolo grafico
- 21. Applicazioni multiple, dominio singolo quanti endpoint SSL sono richiesti?
- 22. Funzioni multiple in un singolo tocco o istruzione aggregata
- 23. Database utente singolo o database multiutente
- 24. SQL deadlocking ... in modalità utente singolo ora
- 25. Kafka fallimento singolo utente in un gruppo
- 26. Come estrarre un singolo blocco di byte da un file?
- 27. Funzioni multiple su un singolo evento con JQuery/Javascript
- 28. Visualizzazioni multiple in un singolo file in Sublime Text 3
- 29. Java7 gestione di eccezioni multiple
- 30. Elaborazione code e code di database
Qual è la differenza tra questa e una singola coda di blocco che viene data a più produttori? –
Penso che ciò che Alex vuole realizzare sia creare una coda di blocco (wrapper) su più code di blocco in modo che un consumatore possa semplicemente aspettare su una singola coda di blocco. Forse la situazione impedisce ad Alex di richiedere ai produttori di utilizzare la stessa istanza di coda di blocco. – sjlee
Il problema è che non voglio più consumatori per coda. Se dovessi scaricare tutto in una coda, i consumatori sarebbero in grado di mangiare dalla stessa coda. Quindi se ho una coda con A e una coda con B's. Nessun B può essere preso fintanto che un altro B è ancora in corso. – Alex