El uso de la colección JAVA DelayQueue (cola de tiempo de espera síncrono)

https://www.cnblogs.com/hhan/p/10678466.html
Expandir directorios del artículo [a] Introducción [dos] jerarquía de herencia DelayQueue 1 . El método básico de Take () PUT (E) de la oferta (E) poll () PEEK ( ) size () clear () [3] Use DelayQueue para preparar la clase de implementación retrasada 1. Constructor [1] Introducción Una cola de bloqueo ilimitada desde la api de Java El elemento retrasado solo puede extraer elementos cuando expira el retraso. La cabeza de la cola es el elemento Retraso con el mayor tiempo de retención después de que expira el retraso. Si ninguno de los retrasos ha expirado, la cola no tiene encabezado y la encuesta volverá nula . Cuando el método getDelay (TimeUnit.NANOSECONDS) de un elemento devuelve un valor menor o igual a 0, se produce una caducidad. Incluso si no puede usar take o poll para eliminar elementos no vencidos, no se tratarán como elementos normales. Por ejemplo, el método de tamaño devuelve el recuento de elementos caducados y no caducados. No se permiten elementos nulos en esta cola . [Dos] Jerarquía de herencia DelayQueue pública de claseDelayQueue <E extiende Demorado > extiende AbstractQueue <E> implementa BlockingQueue <E> 1 1. El método principal take () obtiene y elimina el encabezado de esta cola y espera (si corresponde) Necesario) put (E) inserta el elemento especificado en esta cola de retraso. offer (E) inserta el elemento especificado en esta cola de retraso. poll () obtiene y elimina el encabezado de esta cola, o devuelve nulo si esta cola no contiene un elemento con un tiempo de retraso vencido . peek () obtiene pero no elimina el encabezado de esta cola; si esta cola está vacía, devuelve nulo . size () devuelve el número de elementos en esta colección. clear () elimina automáticamente todos los elementos de esta cola de retraso. [Tres] Utilice DelayQueue para preparar la clase de implementación retrasada DelayQueue <E extiende Retraso>Usando esta cola de tiempo de espera, de acuerdo con su tipo de restricción genérica, el elemento que almacena debe ser una subclase de la interfaz Retrasada; por lo tanto, primero debemos construir dicha subclase, suponiendo que haya una tarea programada Tarea, y luego desde el tiempo establecido Saque la cola y ejecútelo Tarea programada Tarea / ** * * Tarea programada * / Tarea de clase pública { // ID de tarea Private ID de entero; // Nombre de tarea Private Nombre de cadena; // Tiempo de ejecución privado Largo tiempo; Tarea pública (ID de entero , String name, Long time) { this .id = id; this .name = name; this .time = time; } public Integer getId () { return id; } public void setId (Id. entero) { this .id = id; } public String getName () { return name; } public void setName (String name) { this .name = name; } public Long getTime () { tiempo de retorno ; } public void setTime (Long time) { this .time = time; } @Override publicString toString () { return "Tarea [id =" + id + ", name =" + name + ", time =" + new Date (time) .toString () + "]" ; } } Clase de implementación retrasada: porque No queremos cambiar la estructura de la Tarea, así que cree otra clase de implementación TaskDelayed public class TaskDelayed implementa Delayed { // task private Task task; public TaskDelayed (Task task) { super (); this .task = task; } public Task getTask ( ) { return task; } @Override public intcompareTo (Retrasado o) { return ( int ) ( this .getDelay (TimeUnit.MILLISECONDS) - o.getDelay (TimeUnit.MILLISECONDS)); } @Override public long getDelay (unidad TimeUnit) { long time = task.getTime (); long currentTime = System.currentTimeMillis (); return unit.convert (time - currentTime, TimeUnit.MILLISECONDS); } } 1 . 构造 方法 BlockingQueue <TaskDelayed> queue = new DelayQueue <> (); 1 put 与 take (一直 阻塞 直到 完成 操作 为止) public static void main (String [] args) lanza InterruptedException { BlockingQueue <TaskDelayed> queue = new DelayQueue <> (); queue.put ( nueva TaskDelayed ( nueva tarea (5, "ssss", System.currentTimeMillis () + 9000L ))); queue.put ( nueva TaskDelayed ( nueva tarea (2, "ssss", System.currentTimeMillis () + 6000L ))); queue.put ( nueva TaskDelayed ( nueva tarea (3, "ssss", System.currentTimeMillis () + 7000L ))); queue.put (nueva TaskDelayed ( nueva tarea (1, "ssss", System.currentTimeMillis () + 5000L ))); queue.put ( nueva TaskDelayed ( nueva tarea (4, "ssss", System.currentTimeMillis () + 8000L ))); for (;;) { System.out.println (queue.take (). getTask () + "----" + nueva fecha ()); } } 执行 结果 Tarea [id = 1, nombre = ssss, hora = mié 23 de enero 14:09:12 CST 2019] ---- mié 23 de enero 14:09:12 CST 2019 Tarea [id = 2, nombre = ssss , hora = mié 23 de enero 14:09:13 CST 2019] ---- mié 23 de enero 14:09:13 CST 2019 Tarea [id= 3, nombre = ssss, hora = mié 23 de enero 14:09:14 CST 2019] ---- mié 23 de enero 14:09:14 CST 2019 Tarea [id = 4, nombre = ssss, hora = mié 23 de enero 14 : 09: 15 CST 2019] ---- Mié 23 de enero 14:09:15 CST 2019 Tarea [id = 5, nombre = ssss, hora = Mié 23 de enero 14:09:16 CST 2019] ---- Mié Ene 23 14:09:16 CST 2019 El tiempo que se tarda aquí es el mismo que el tiempo actual del sistema, porque especificamos el tiempo que lo sacó. El método clave es Interfaz pública retrasada Retraso extendido Comparable <Delayed> { long getDelay (unidad TimeUnit); } Implementación específica: Devuelve el tiempo de retraso restante asociado con este objeto, expresado en la unidad de tiempo dada. @Override public long getDelay (unidad TimeUnit) { long time = task.getTime (); long currentTime = System.currentTimeMillis (); return unit.convert (time- currentTime, TimeUnit.MILLISECONDS); } ———————————————— Declaración de copyright: Este artículo es para bloggers de CSDN El artículo original de " Ape- Jojo" sigue el acuerdo de copyright CC 4.0 BY- SA. Adjunte el enlace original y esta declaración para su reimpresión. Enlace original: https: // blog.csdn.net/weixin_39554102/article/details/86608830

 

Supongo que te gusta

Origin www.cnblogs.com/kelelipeng/p/12721510.html
Recomendado
Clasificación