2011-12-21 28 views

Respuesta

39

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).

+0

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

+8

@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

+0

Uso SyncQ bastante, es un buen resumen de transferencia y relativamente bueno. (tiene asignación al esperar) – bestsss

9

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.

0

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.

Cuestiones relacionadas