Pregunta

Necesito una cola que pueda ser procesada por varios lectores.

Los lectores eliminarán un elemento y lo enviarán a un servicio REST.

Lo que es importante tener en cuenta son:

  • Cada lector debería estar eliminando elementos diferentes. Si la cola tiene elementos A, B & amp; C, el subproceso 1 debe eliminar A y el subproceso 2 debe eliminar B de manera concurrente. Y así sucesivamente hasta que no haya nada en la cola.
  • Entiendo que el uso intensivo de la CPU siempre se ejecuta en un bucle ocupado, mirando a la cola para buscar elementos. Por lo tanto, no estoy seguro de si una cola de bloqueo es una buena opción.

¿Cuáles son mis opciones?

¿Fue útil?

Solución

ConcurrentLinkedQueue o LinkedBlockingQueue son dos opciones que inmediatamente viene a la mente, dependiendo de si desea bloquear el comportamiento o no.

Como señala Adamski, el método take () del LinkedBlockingQueue no quema innecesariamente los ciclos de la CPU mientras espera que lleguen los datos.

Otros consejos

No estoy seguro de la descripción de su pregunta si los hilos necesitan eliminar elementos de una manera estricta. Suponiendo que esto no sea una restricción, puede usar el método BlockingQueue take () , lo que hará que el hilo se bloquee hasta que los datos estén disponibles (por lo tanto, no consume CPU ciclos).

También tenga en cuenta que las implementaciones de take () son atómicas (por ejemplo, LinkedBlockingQueue ): si se bloquean varios subprocesos en take () y se pone en cola un único elemento, entonces solo se devolverá una llamada take () del hilo; el otro permanecerá bloqueado.

La principal diferencia entre ConcurrentLinkedQueue y LinkedBLockingQueue es su rendimiento. Bajo contención moderada de hilos ConcurrentLinkedQueue supera en gran medida a todos los demás BlockingQueues. Sin embargo, bajo una fuerte disputa, un BlockingQueue es una opción un poco mejor, ya que colocará adecuadamente los hilos en el conjunto de hilos en espera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top