Ho un'applicazione multi thread che ha un thread di produzione e numerosi thread di consumo. I dati vengono archiviati in una raccolta condivisa e protetta da thread e scaricati su un database quando nel buffer sono presenti dati sufficienti.Buffering dei dati nell'applicazione java con multithreading
Dalle javadocs -
BlockingQueue<E>
una coda che supporta anche operazioni che attendono la coda di diventare non vuoto quando si recuperano un elemento, e attendere spazio diventi disponibile nella coda quando si memorizza un elemento .
take()
Recupera e rimuove il capo di questa coda, in attesa, se necessario, fino a quando un elemento diventa disponibile.
Le mie domande -
- C'è un'altra collezione che ha un metodo E [] prendere (int n)? Ad esempio, la coda di blocco attende fino a quando un elemento è disponibile. Quello che voglio è che dovrebbe aspettare fino a 100 o 200 elementi sono disponibili.
- In alternativa, esiste un altro metodo che è possibile utilizzare per risolvere il problema senza eseguire il polling?
Gli elementi devono essere distribuiti equamente a ciascun consumatore o il primo consumatore al metodo take ottiene i primi elementi 'n', il secondo consumatore gli elementi successivi' n', ecc.? – SimonC
Questo è davvero quello che vuoi fare?Ciò può introdurre una latenza quasi arbitrariamente ampia tra i dati prodotti e scaricati nel database se il ritmo di produzione rallenta sempre oltre ciò che si finisce per essere sintonizzati. Se hai davvero bisogno di fare questo buffering, la tua logica dovrebbe probabilmente essere più come "Aspetta di avere N elementi o X ms sono passati" – DRMacIver
Perché vuoi aspettare? Perché non usare semplicemente 'drain()'? Scriverò tutti i dati che hai a disposizione fino ad un massimo e preferirei non perdere i dati. –