Tengo una aplicación multiproceso que tiene un subproceso productor y varios subprocesos de consumidor. Los datos se almacenan en una recopilación segura de subprocesos compartidos y se descargan a una base de datos cuando hay suficientes datos en el búfer.Almacenamiento en memoria intermedia de datos en la aplicación java multiproceso
De los javadocs -
BlockingQueue<E>
una cola que, además, apoya las operaciones que aguardan a que la cola se convierta en no vacío al recuperar un elemento, y espera a que el espacio que estén disponibles en la cola al almacenar un elemento .
take()
Recupera y elimina la cabeza de esta cola, a la espera de ser necesario hasta que un elemento esté disponible.
Mis preguntas -
- ¿Hay otra colección que tiene un método E [] tomar (int n)? es decir, la cola de bloqueo espera hasta que un elemento esté disponible. Lo que quiero es que deba esperar hasta que estén disponibles 100 o 200 elementos.
- Alternativamente, ¿hay otro método que podría utilizar para abordar el problema sin sondeo?
caso de que los elementos se distribuirán por igual a cada consumidor, o de que las primera consumidor con el método de toma obtener los primeros 'elementos N', el segundo consumidor los próximos' elementos N', etc.? – SimonC
¿Es esto realmente lo que quieres hacer?Esto puede introducir una latencia casi arbitrariamente grande entre los datos que se están produciendo y los que se descargan a la base de datos si la velocidad de producción se frena más allá de lo que terminas sintonizando. Si realmente necesita hacer este almacenamiento en búfer en toda su lógica, probablemente debería ser más como "Espere hasta que tenga N elementos o haya pasado X ms" – DRMacIver
¿Por qué desea esperar? ¿Por qué no usar 'drain()'? Escribiría todos los datos que tiene disponibles hasta un máximo y preferiría no perder datos. –