new SynchronousQueue()
new LinkedBlockingQueue(1)
¿Cuál es la diferencia? ¿Cuándo debo usar SynchronousQueue
contra LinkedBlockingQueue
con capacidad 1?Cuándo debería usar SynchronousQueue
new SynchronousQueue()
new LinkedBlockingQueue(1)
¿Cuál es la diferencia? ¿Cuándo debo usar SynchronousQueue
contra LinkedBlockingQueue
con capacidad 1?Cuándo debería usar SynchronousQueue
SynchronousQueue es más un handoff, mientras que LinkedBlockingQueue solo permite un elemento único. La diferencia es que la llamada put() a un SynchronousQueue no devolverá hasta que haya una llamada take() correspondiente, pero con un LinkedBlockingQueue del tamaño 1, la llamada put() a una cola vacía volverá inmediatamente.
No puedo decir que alguna vez haya usado el SynchronousQueue directamente, pero es el BlockingQueue predeterminado usado para los métodos Executors.newCachedThreadPool()
. Básicamente es la implementación de BlockingQueue para cuando no realmente desea una cola (no desea mantener ningún dato pendiente).
Por lo que entiendo el código anterior hago las mismas cosas.
No, el código no es el mismo en absoluto.
Sync.Q. requiere tener camarero (s) para que la oferta tenga éxito. LBQ mantendrá el artículo y la oferta terminará inmediatamente, incluso si no hay camarero.
SyncQ es útil para el traspaso de tareas. Imagina que tienes una lista con la tarea pendiente y 3 subprocesos disponibles esperando en la cola, prueba offer()
con 1/4 de la lista si no se acepta, el subproceso puede ejecutar la tarea por sí mismo. [el último 1/4 debe ser manejado por el hilo actual, si se pregunta 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, con LBQ, dejar la tarea en la cola no garantiza ninguna ejecución.
Nota: el caso w/consumidores y los editores es la misma, es decir, el editor puede bloquear y esperar a que los consumidores pero después offer
o poll
rendimientos, que asegura la/elemento de tarea es ser manipulados.
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: Implementation of BlockingQueue: What are the differences between SynchronousQueue and LinkedBlockingQueue
SynchronousQueue funciona de una manera similar, con las siguientes diferencias principales: 1) El tamaño de SynchronousQueue es 0 2) puestos() método sólo insertar un elemento si el método de toma() será capaz de obtener esa elemento de la cola en el mismo momento, es decir, no se puede insertar un elemento si la llamada al consumidor take() tardará un tiempo en consumirlo.
SynchronousQueue: inserte solo cuando alguien lo reciba en ese momento.
Ok, entonces la idea principal es que bloquea el hilo de lectura hasta que el resultado esté listo y bloquea el hilo de escritura hasta que el hilo de lectura esté listo para leer. ¿Podría proporcionar un ejemplo de la vida real cuando podría ser útil? – Anton
@Umar Cuando varios subprocesos producen objetos para la cola más rápido de lo que los consumidores pueden consumir y procesarlos, una cola puede aumentar de tamaño. SynchronousQueue ayuda a controlar la comunicación sin ningún código específico en los productores.En la vida real, es similar a una reunión en la que una persona responde preguntas hechas por otros. Considere SynchronousQueue como una especie de secretaria. – andrey
Uso SyncQ bastante, es un buen resumen de transferencia y relativamente bueno. (tiene asignación al esperar) – bestsss