La interfaz TransferQueue es miembro de Java Collections Framework . Fue introducido en JDK 1.7, pertenece al paquete java.util.concurrent . TransferQueue es una BlockingQueue en la que un subproceso de envío (productor) puede esperar a que el subproceso de recepción (consumidores) reciba elementos. TransferQueue se utiliza en aplicaciones de paso de mensajes. Hay dos aspectos en los que el mensaje se pasará del hilo del productor al hilo del consumidor.
- put(E e) : este método se usa si el productor quiere poner elementos en cola sin esperar a un consumidor. Sin embargo, espera hasta que el espacio esté disponible si la cola está llena.
- transfer(E e) : este método generalmente se usa para transferir un elemento a un subproceso que está esperando recibirlo, si no hay un subproceso en espera, esperará hasta que un subproceso llegue al estado de espera tan pronto como llegue el subproceso en espera. el elemento será transferido a él.
También se puede consultar una TransferQueue, a través de hasWaitingConsumer() , si hay subprocesos esperando elementos, que es una analogía inversa a una operación de inspección.
Declaración
public interface TransferQueue<E> extends BlockingQueue<E>
Aquí, E es el tipo de elementos almacenados en la colección.
La jerarquía de TransferQueue
Extiende las interfaces BlockingQueue<E> , Collection<E> , Iterable<E> , Queue<E> .
Ejemplo:
Java
// Java Program Demonstrate TransferQueue import java.util.concurrent.*; import java.util.*; public class TransferQueueDemo { public static void main(String[] args) throws InterruptedException { // create object of TransferQueue // using LinkedTransferQueue() constructor TransferQueue<Integer> TQ = new LinkedTransferQueue<Integer>(); // Add numbers to end of queue TQ.add(7855642); TQ.add(35658786); TQ.add(5278367); TQ.add(74381793); // print Queue System.out.println("Queue1: " + TQ); // create object of TransferQueue // using LinkedTransferQueue(Collection c) // constructor TransferQueue<Integer> TQ2 = new LinkedTransferQueue<Integer>(TQ); // print Queue System.out.println("Queue2: " + TQ2); } }
Queue1: [7855642, 35658786, 5278367, 74381793] Queue2: [7855642, 35658786, 5278367, 74381793]
Implementando Clases
TransferQueue tiene una clase de implementación que es LinkedTransferQueue . LinkedTransferQueue es una implementación ilimitada de la interfaz TransferQueue basada en Nodes vinculados. Los elementos en LinkedTransferQueue están ordenados en orden FIFO, con la cabeza apuntando al elemento que ha estado en la cola durante más tiempo y la cola apuntando al elemento que ha estado en la cola durante menos tiempo.
Debido a su naturaleza asíncrona, size() atraviesa toda la colección, por lo que no es una operación de tiempo O(1). También puede dar un tamaño inexacto si esta colección se modifica durante el recorrido. No se garantiza que las operaciones masivas como addAll, removeAll, retainAll, containsAll, equals y toArray se realicen de forma atómica. Por ejemplo, un iterador que opera simultáneamente con una operación addAll podría observar solo algunos de los elementos agregados.
Sintaxis:
TransferQueue<E> objectName = new LinkedTransferQueue<E>();
Operaciones básicas
1. Agregar elementos
LinkedTransferQueue proporciona la implementación de varios métodos para agregar o insertar elementos. Son add(E e) , put(E e) , offer(E e) , transfer(E e) . Los métodos add, put y offer no se preocupan de que otros subprocesos accedan a la cola o no, mientras que transfer() espera uno o más subprocesos destinatarios.
Java
// Java Program Demonstrate adding // elements to TransferQueue import java.util.concurrent.*; class AddingElementsExample { public static void main(String[] args) throws Exception { // Initializing the queue TransferQueue<Integer> queue = new LinkedTransferQueue<Integer>(); // Adding elements to this queue for (int i = 10; i <= 14; i++) queue.add(i); // Add the element using offer() method System.out.println("adding 15 " + queue.offer(15, 5, TimeUnit.SECONDS)); // Adding elements to this queue for (int i = 16; i <= 20; i++) queue.put(i); // Printing the elements of the queue System.out.println( "The elements in the queue are:"); for (Integer i : queue) System.out.print(i + " "); System.out.println(); // create another queue to demonstrate transfer // method TransferQueue<String> g = new LinkedTransferQueue<String>(); new Thread(new Runnable() { public void run() { try { System.out.println("Transferring" + " an element"); // Transfer a String element // using transfer() method g.transfer("is a computer" + " science portal."); System.out.println( "Element " + "transfer is complete"); } catch (InterruptedException e1) { System.out.println(e1); } catch (NullPointerException e2) { System.out.println(e2); } } }) .start(); try { // Get the transferred element System.out.println("Geeks for Geeks " + g.take()); } catch (Exception e) { System.out.println(e); } } }
adding 15 true The elements in the queue are: 10 11 12 13 14 15 16 17 18 19 20 Transferring an element Element transfer is complete Geeks for Geeks is a computer science portal.
2. Eliminación de elementos
La implementación del método remove() proporcionada por LinkedTransferQueue se usa para eliminar un elemento si está presente en esta cola.
Java
// Java Program Demonstrate removing // elements of TransferQueue import java.util.concurrent.*; class RemoveElementsExample { public static void main(String[] args) { // Initializing the queue TransferQueue<Integer> queue = new LinkedTransferQueue<Integer>(); // Adding elements to this queue for (int i = 1; i <= 5; i++) queue.add(i); // Printing the elements of the queue System.out.println( "The elements in the queue are:"); for (Integer i : queue) System.out.print(i + " "); // remove() method will remove the specified // element from the queue queue.remove(1); queue.remove(5); // Printing the elements of the queue System.out.println("\nRemaining elements in queue : "); for (Integer i : queue) System.out.print(i + " "); } }
The elements in the queue are: 1 2 3 4 5 Remaining elements in queue : 2 3 4
3. Iterando
La implementación del método iterator () proporcionada por LinkedTransferQueue se utiliza para devolver un iterador sobre los elementos de esta cola en la secuencia adecuada.
Java
// Java Program Demonstrate // iterating over TransferQueue import java.util.Iterator; import java.util.concurrent.*; class IteratingExample { public static void main(String[] args) { // Initializing the queue TransferQueue<String> queue = new LinkedTransferQueue<String>(); // Adding elements to this queue queue.add("Gfg"); queue.add("is"); queue.add("fun!!"); // Returns an iterator over the elements Iterator<String> iterator = queue.iterator(); // Printing the elements of the queue while (iterator.hasNext()) System.out.print(iterator.next() + " "); } }
Gfg is fun!!
Métodos de TransferQueue
MÉTODO |
DESCRIPCIÓN |
---|---|
getWaitingConsumerCount() | Devuelve una estimación de la cantidad de consumidores que esperan recibir elementos a través de BlockingQueue.take() o una encuesta cronometrada. |
tieneConsumidorEsperando() | Devuelve verdadero si hay al menos un consumidor esperando recibir un elemento a través de BlockingQueue.take() o una encuesta cronometrada. |
transferencia(E e) | Transfiere el elemento a un consumidor, esperando si es necesario hacerlo. |
TryTransfer(E e) | Transfiere el elemento a un consumidor en espera inmediatamente, si es posible. |
tryTransfer(E e, tiempo de espera prolongado, unidad TimeUnit) | Transfiere el elemento a un consumidor si es posible hacerlo antes de que transcurra el tiempo de espera. |
Métodos declarados en la interfaz java.util.concurrent.BlockingQueue
MÉTODO | DESCRIPCIÓN |
---|---|
agregar(E e) | Inserta el elemento especificado en esta cola si es posible hacerlo de inmediato sin infringir las restricciones de capacidad, devolviendo verdadero en caso de éxito y lanzando una IllegalStateException si no hay espacio disponible actualmente. |
contiene(Objeto o) | Devuelve verdadero si esta cola contiene el elemento especificado. |
drenajeA(Colección<? super E> c) | Elimina todos los elementos disponibles de esta cola y los agrega a la colección dada. |
drenajeA(Colección<? super E> c, int maxElements) | Elimina como máximo el número dado de elementos disponibles de esta cola y los agrega a la colección dada. |
oferta(E e) | Inserta el elemento especificado en esta cola si es posible hacerlo de inmediato sin violar las restricciones de capacidad, devolviendo verdadero si tiene éxito y falso si no hay espacio disponible actualmente. |
oferta(E e, tiempo de espera largo, unidad TimeUnit) | Inserta el elemento especificado en esta cola, esperando hasta el tiempo de espera especificado si es necesario para que haya espacio disponible. |
sondeo(tiempo de espera prolongado, unidad TimeUnit) | Recupera y elimina el encabezado de esta cola, esperando hasta el tiempo de espera especificado si es necesario para que un elemento esté disponible. |
poner(E e) | Inserta el elemento especificado en esta cola y espera, si es necesario, a que haya espacio disponible. |
capacidad restante() | Devuelve el número de elementos adicionales que esta cola puede aceptar idealmente (en ausencia de restricciones de memoria o recursos) sin bloqueo, o Integer.MAX_VALUE si no hay un límite intrínseco. |
eliminar(Objeto o) | Elimina una sola instancia del elemento especificado de esta cola, si está presente. |
tomar() | Recupera y elimina el encabezado de esta cola, esperando si es necesario hasta que un elemento esté disponible. |
Métodos declarados en la interfaz java.util.Collection
MÉTODO | DESCRIPCIÓN |
---|---|
addAll(Colección<? extiende E> c) | Agrega todos los elementos de la colección especificada a esta colección (operación opcional). |
clear() | Elimina todos los elementos de esta colección (operación opcional). |
contieneTodo(Colección<?> c) | Devuelve verdadero si esta colección contiene todos los elementos de la colección especificada. |
es igual a(Objeto o) | Compara el objeto especificado con esta colección para la igualdad. |
código hash() | Devuelve el valor del código hash para esta colección. |
esta vacio() | Devuelve verdadero si esta colección no contiene elementos. |
iterador() | Devuelve un iterador sobre los elementos de esta colección. |
flujoParalelo() | Devuelve un Stream posiblemente paralelo con esta colección como fuente. |
removeAll(Colección<?> c) | Elimina todos los elementos de esta colección que también están contenidos en la colección especificada (operación opcional). |
removeIf(predicado<? filtro super E>) | Elimina todos los elementos de esta colección que satisfacen el predicado dado. |
retenerTodo(Colección<?> c) | Retiene solo los elementos de esta colección que están contenidos en la colección especificada (operación opcional). |
Talla() | Devuelve el número de elementos de esta colección. |
divisor() | Crea un Spliterator sobre los elementos de esta colección. |
corriente() | Devuelve un Stream secuencial con esta colección como fuente. |
aArray() | Devuelve una array que contiene todos los elementos de esta colección. |
toArray(IntFunction<T[]> generador) | Devuelve una array que contiene todos los elementos de esta colección, utilizando la función de generador proporcionada para asignar la array devuelta. |
a la Array(T[] a) | Devuelve una array que contiene todos los elementos de esta colección; el tipo de tiempo de ejecución de la array devuelta es el de la array especificada. |
Métodos declarados en la interfaz java.lang.Iterable
MÉTODO | DESCRIPCIÓN |
---|---|
forEach(Consumidor<? super T> acción) | Realiza la acción dada para cada elemento del iterable hasta que se hayan procesado todos los elementos o la acción genere una excepción. |
Métodos declarados en la interfaz java.util.Queue
MÉTODO | DESCRIPCIÓN |
---|---|
elemento() | Recupera, pero no elimina, el encabezado de esta cola. |
ojeada() | Recupera, pero no elimina, el encabezado de esta cola o devuelve un valor nulo si esta cola está vacía. |
encuesta() | Recupera y elimina el encabezado de esta cola, o devuelve un valor nulo si esta cola está vacía. |
retirar() | Recupera y elimina el encabezado de esta cola. |
Referencia: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/TransferQueue.html
Publicación traducida automáticamente
Artículo escrito por Ganeshchowdharysadanala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA