Cuándo debo usar SynchronousQueue


new SynchronousQueue()
new LinkedBlockingQueue(1)

¿Cuál es la diferencia? ¿Cuándo debo usar SynchronousQueue contra LinkedBlockingQueue con capacidad 1?

Author: Anton, 2011-12-21

4 answers

El SynchronousQueue es más bien un handoff, mientras que el LinkedBlockingQueue solo permite un solo elemento. La diferencia es que la llamada put() a un SynchronousQueue no devolverá hasta que haya una llamada take() correspondiente, pero con un LinkedBlockingQueue de tamaño 1, la llamada put () (a una cola vacía) regresará inmediatamente.

No puedo decir que alguna vez haya usado el SynchronousQueue directamente, pero es el BlockingQueue predeterminado utilizado para los métodos Executors.newCachedThreadPool(). Es esencialmente la implementación de BlockingQueue para cuando no realmente desea una cola (no desea mantener ningún dato pendiente).

 40
Author: jtahlborn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-07 14:46:09

Hasta donde yo entiendo el código anterior, haz las mismas cosas.

No, el código no es el mismo en absoluto.

Sync.P. requiere tener camarero(s) para la oferta para tener éxito. LBQ se quedará con el artículo y la oferta terminará inmediatamente incluso si no hay camarero.

SyncQ es útil para la transferencia de tareas. Imagine que tiene una lista con tarea pendiente y 3 subprocesos disponibles esperando en la cola, intente offer() con 1/4 de la lista si no se acepta, el subproceso puede ejecutar la tarea por su cuenta. [el último 1/4 debe ser manejado por el hilo actual, si te preguntas por qué 1/4 y no 1/3]

Piense en intentar entregar la tarea a un trabajador, si no hay ninguna disponible, tiene una opción para ejecutar la tarea por su cuenta (o lanzar una excepción). Por el contrario w/ LBQ, dejar la tarea en la cola no garantiza ninguna ejecución.

Nota: el caso w/ consumidores y editores es el mismo, es decir, el editor puede bloquear y esperar a los consumidores, pero después de offer o poll devuelve, se asegura la tarea/elemento debe ser manejado.

 9
Author: bestsss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-21 20:31:02

Una razón para usar SynchronousQueue es mejorar el rendimiento de la aplicación. Si debe tener una transferencia entre hilos, necesitará algún objeto de sincronización. Si puede satisfacer las condiciones requeridas para su uso, SynchronousQueue es el objeto de sincronización más rápido que he encontrado. Otros están de acuerdo. Ver: Implementación de BlockingQueue: ¿Cuáles son las diferencias entre SynchronousQueue y LinkedBlockingQueue

 6
Author: snadata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:52

SynchronousQueue funciona de manera similar con las siguientes diferencias principales: 1) El tamaño de SynchronousQueue es 0 2) el método put () solo insertará un elemento si el método take() será capaz de recuperar ese elemento de la cola en el mismo momento, es decir, un elemento no se puede insertar si la llamada del consumidor take () va a tomar algún tiempo para consumirlo.

SynchronousQueue-Inserte solo cuando alguien lo recibirá en ese momento.

 0
Author: Deepa Bhatia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-13 14:26:07