Uso de la cola de subprocesos de Java - DelayQueue

DelayQueue es una cola de retraso cuyos elementos deben implementar la interfaz Delayed, que define un método getDelay para devolver el tiempo de retraso restante del elemento. DelayQueue se ordenará según el tiempo de retraso de los elementos, y solo cuando el tiempo de retraso del elemento sea 0 o un número negativo, se podrá obtener de la cola.

DelayQueue se puede utilizar para implementar tareas de temporización, caducidad de caché y otros escenarios. Por ejemplo, el siguiente código crea un DelayQueue y le agrega cuatro elementos, cada uno con un tiempo de retraso diferente. Luego recorra los elementos de la cola e imprímalos.

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

// 定义一个延迟任务类,实现Delayed接口
class DelayTask implements Delayed {
    // 任务名称
    private String name;
    // 任务执行时间(毫秒)
    private long executeTime;

    // 构造方法,传入任务名称和延迟时间(秒)
    public DelayTask(String name, long delay) {
        this.name = name;
        // 将延迟时间转换为执行时间
        this.executeTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(delay);
    }

    @Override
    public long getDelay(TimeUnit unit) {
        // 返回剩余延迟时间
        return unit.convert(executeTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        // 比较剩余延迟时间
        return Long.compare(this.getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));
    }

    @Override
    public String toString() {
        return "DelayTask{" +
                "name='" + name + '\'' +
                ", executeTime=" + executeTime +
                '}';
    }
}

public class DelayQueueDemo {
    public static void main(String[] args) {
        // 创建一个延迟队列
        DelayQueue<DelayTask> dq = new DelayQueue<>();
        // 向队列中添加四个元素,注意它们的延迟时间
        dq.offer(new DelayTask("task1", 5));
        dq.offer(new DelayTask("task2", 2));
        dq.offer(new DelayTask("task3", 7));
        dq.offer(new DelayTask("task4", 3));
        // 从队列中循环获取元素,并打印出来
        while (dq.size() > 0) {
            try {
                System.out.println(dq.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Resultado de salida:

DelayTask{name='task2', executeTime=1645185003739}
DelayTask{name='task4', executeTime=1645185005739}
DelayTask{name='task1', executeTime=1645185007739}
DelayTask{name='task3', executeTime=1645185011739}

Se puede observar que los elementos de la cola se obtienen en orden de tiempo de retardo, es decir, primero se obtiene el elemento con menor tiempo de retardo y luego se obtiene el elemento con mayor tiempo de retardo.

Supongo que te gusta

Origin blog.csdn.net/caicai250/article/details/131441266
Recomendado
Clasificación