La interfaz de la cola está en el mismo nivel que List and Set, y ambos heredan la interfaz de colección. LinkedList implementa la interfaz de cola. La interfaz de la cola reduce el acceso al método LinkedList (es decir, si el tipo de parámetro en el método es una cola, solo puede acceder a los métodos definidos por la interfaz de cola, y no puede acceder directamente a los métodos que no son de la lista de enlaces), por lo que solo se puede utilizar el método apropiado. Bloquingqueue hereda la interfaz de la cola.
Una cola es una estructura de datos. Tiene dos operaciones básicas: agregar un elemento al final de la cola y eliminar un elemento de la cabeza de la cola significa que la cola gestiona los datos de una manera en primer lugar. Si intenta agregar un elemento a una cola de bloqueo completa o eliminar un metasector de una cola de bloqueo vacío, hará que el hilo se bloquee. Bloquear las colas es una herramienta útil al cooperar con múltiples hilos. Los hilos de trabajadores pueden almacenar regularmente los resultados intermedios en una cola de bloqueo, mientras que otros hilos de trabajadores toman resultados intermedios y modificarlos en el futuro. La cola equilibra automáticamente la carga. Si el primer conjunto de hilo funciona más lento que el segundo, el segundo conjunto de hilo se bloqueará mientras espera el resultado. Si el primer conjunto de hilos se ejecuta rápidamente, esperará que el segundo conjunto de hilo se ponga al día. La siguiente tabla muestra las operaciones de las colas de bloqueo en JDK1.5:
Agregar agregue un MetaSearch Si la cola está llena, arroje una excepción iiiegaislabeeplian
Retire eliminar y devuelva el elemento en la cabeza de la cola. Si la cola está vacía, se lanza una excepción de NosuchelementException.
El elemento devuelve el elemento en la cabeza de la cola. Si la cola está vacía, se lanza una excepción de NosuchelementException.
Oferta Agregar un elemento y devuelve verdadero si la cola está completa, devuelve falso
La encuesta elimina y devuelve el elemento en la cabeza de la cola. Si la cola está vacía, regrese nulo.
Peek devuelve el elemento a la cabeza de la cola. Si la cola está vacía, regresa nulo
poner agregar un elemento si la cola está llena, bloqueando
Tome eliminar y devuelva el elemento a la cabeza de la cola. Si la cola está vacía, bloques
Eliminar, el elemento, la oferta, la encuesta y la mirada pertenecen a la interfaz de la cola.
Las operaciones que bloquean las colas se pueden dividir en las siguientes tres categorías de acuerdo con sus respuestas: las operaciones de AAD, remove y elementos lanzan excepciones cuando intenta agregar elementos a una cola completa o obtener elementos de una cola vacía. Por supuesto, en un programa múltiple, la cola puede estar llena o vacía en cualquier momento, por lo que es posible que desee utilizar la oferta, los métodos de vista, la encuesta y la vista. Estos métodos simplemente dan un mensaje de error cuando la tarea no se puede completar sin lanzar una excepción.
NOTA: Errores de métodos de encuesta y mirada y retorno nulo. Por lo tanto, es ilegal insertar un valor nulo en la cola.
También hay variantes de método de oferta y encuesta con tiempos de espera, por ejemplo, las siguientes llamadas:
éxito booleano = q.offer (x, 100, timeunit.milliseConds);
Intente insertar un elemento en la cola de la cola en 100 milisegundos. Si tiene éxito, regrese verdadero de inmediato; De lo contrario, cuando se alcanza el tiempo de espera, regrese falso. Del mismo modo, llame:
Cabeza de objeto = Q.Poll (100, TimeUnit.MilliseConds);
Si el elemento de encabezado de cola se elimina con éxito dentro de los 100 milisegundos, el elemento del encabezado se devuelve de inmediato; De lo contrario, NULL se devuelve cuando se alcanza el tiempo de espera.
Finalmente, tenemos operaciones de bloqueo puestas y tomadas. El método PUT bloquea cuando la cola está llena y el método Take bloquea cuando la cola está vacía.
El paquete java.ulil.concurrent proporciona 4 variantes de colas de bloqueo. Por defecto, la capacidad de LinkedBlokingqueue no es un límite superior (es inexacta. La capacidad es entera. Es una cola basada en una lista vinculada, que clasifica los elementos de FIFO (primero en primera salida).
ArrayBlockingqueue debe especificar la capacidad durante la construcción, y puede elegir si se requiere justicia. Si el parámetro justo se establece verdadero, el hilo con el tiempo de espera más largo se procesará primero (de hecho, esta equidad se logra estableciendo ReentrantLock en verdadero: es decir, el hilo con el tiempo de espera más largo funcionará primero). Por lo general, la justicia puede costarle el rendimiento y solo usarlo cuando sea realmente necesario. Es una cola de bucle de bloqueo basada en una matriz que clasifica a los elementos de acuerdo con el principio de FIFO (primero en primera salida).
PriorityBlockingqueue es una cola con prioridad, no una cola en primer lugar. Los elementos se eliminan en orden de prioridad, y la cola no tiene límite superior (miré el código fuente. OutOfMemoryError debido a que el recurso se agota), pero si la cola está vacía, la operación de la toma del elemento bloqueará, por lo que sus tomas de operación de búsqueda están bloqueadas. Además, los elementos que ingresan a la cola deben tener capacidades comparativas.
Finalmente, Delayqueue (implementado basado en Priorityqueue) es una cola de bloqueo ilimitada que almacena elementos retrasados, y los elementos solo se pueden extraer cuando el retraso expira. El jefe de esta cola es el elemento retrasado con el tiempo de almacenamiento más largo después de que expire el retraso. Si ninguno de los retrasos ha expirado, la cola no tiene encabezados y la encuesta volverá nula. Cuando el método GetDelay (TimeUnit.nanosegundos) de un elemento devuelve un valor inferior o igual a cero, la expiración ocurre y la encuesta elimina el elemento. Esta cola no permite elementos nulos. Aquí está la interfaz de retraso:
Código Java
La interfaz pública retrasada se extiende comparable <sardado> {Long getDelay (unidad de tiempo de tiempo); }El elemento que pone Delayqueue también implementará el método Compareto, que usa esto para ordenar los elementos.
El siguiente ejemplo muestra cómo usar una cola de bloqueo para controlar un conjunto de hilo. El programa busca todos los archivos en un directorio y todos sus subdirectorios, e imprime una lista de archivos que contienen las palabras clave especificadas. Como se puede ver en los siguientes ejemplos, los dos beneficios significativos del uso de colas de bloqueo son: la operación multiproceso de colas comunes no requiere sincronización adicional. Además, la cola equilibrará automáticamente la carga, es decir, si el procesamiento (ambos lados de producción y consumo) se procesa rápidamente, se bloqueará, reduciendo así la brecha de velocidad de procesamiento entre los dos lados. La siguiente es la implementación específica:
Código Java
Public Class BloquingqueUetest {public static void main (string [] args) {Scanner in = new Scanner (System.in); System.out.print ("Ingrese el directorio base (p. Ej. /Usr/local/jdk5.0/src):"); Directorio de cadena = in.nextline (); System.out.print ("Ingrese la palabra clave (por ejemplo, volátil):"); Palabra clave de cadena = in.nextline (); final int file_queue_size = 10; // Bloqueo de tamaño de cola final intsing_threads = 100; // Número de hilos de búsqueda de palabras clave // Bloqueo de cola basada en ArrayBlokingqueueBlockingqueue <archivo> queue = new ArrayBlockqueue <File> (file_queue_size); // Solo inicia un hilo para buscar el directorio fileEnumerationTask enumerator = new FileEnumerationTask (cola, nuevo archivo (directorio)); nuevo hilo (enumerador) .Start (); // Inicie 100 subprocesos para buscar la palabra clave especificada en el archivo para (int i = 1; i <= search_threads; i ++) nuevo hilo (nuevo SearchTask (cola, palabra clave)). Start (); }} class FileEnumerationTask implementos runnable {// El objeto de metafile tonto se coloca al final de la cola de bloqueo para indicar que el archivo ha sido atravesado público de archivo estático dummy = nuevo archivo (""); BLOCKINGQUEZA PRIVADA <Sche> Queue; Archivo privado inicial Directorio; Public FileEnumerationTask (Bloquingqueue <Sche> Queue, File StartingDirectory) {this.queue = queue; this.StarTingDirectory = startingDirectory; } public void run () {try {enumerate (startingDirectory); queue.put (Dummy); // ejecutar aquí para indicar que el archivo en el directorio especificado se ha atravesado} capt (interruptedException e) {}} // coloca todos los archivos en el directorio especificado en el directorio de bloqueo de la cola como objetos de archivo public void enumerate (directorio de archivo) arroja interruptEdexception {archivos [] archivos = directory.listfiles (););););); for (archivo archivo: archivos) {if (file.isDirectory ()) enumerate (archivo); más // Pon el elemento al final de la cola. Si la cola está completa, bloquee queue.put (archivo); }}} Class SearchTask implementa Runnable {private Bloquingqueue <Sche> Queue; Palabra clave de cadena privada; Public SearchTask (Bloquingqueue <Sche> Queue, String Keyword) {this.queue = queue; this.keyword = palabra clave; } public void run () {try {boolean ded = false; while (! hecho) {// obtiene el primer elemento de la cola. Si la cola está vacía, bloquee archivo archivo = queue.take (); if (file == fileenumerationTask.dummy) {// bájalo y póngalo para que otros hilos terminen rápidamente al leerlo queue.put (archivo); hecho = verdadero; } más búsqueda (archivo); }} catch (ioException e) {E.PrintStackTrace (); } Catch (InterruptedException e) {}} public void Search (archivo de archivo) lanza IOException {Scanner in = New Scanner (new FileInputStream (archivo)); int Linenumber = 0; while (in.hasNextLine ()) {Linenumber ++; Línea de cadena = in.nextline (); if (línea.contains (palabra clave)) system.out.printf ("%s:%d:%s%n", file.getPath (), lino, línea); } in.close (); }} Enlace original: http://www.cnblogs.com/end/archive/2012/10/25/2738493.html
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.