Javaの遅延キューの使い方は?
Javaの遅延キュー(DelayQueue)は、Delayedインタフェースを実装した無限ブロッキングキューであり、要素は有効期限が来た時にのみ取り出すことができます。
遅延キューは、タイマータスクのスケジューリングに使用できます。遅延実行が必要なタスクを遅延キューに追加し、その後、消費者スレッドがキューから期限切れのタスクを取り出して実行します。
以下はJavaの遅延キューの利用例です。
- 延迟タスククラスを作成し、Delayedインタフェースを実装し、getDelayメソッドとcompareToメソッドをオーバーライドします。タスククラスには、実行する必要があるタスクのロジックを含めることができます。
public class DelayedTask implements Delayed {
private String taskName;
private long delayTime;
public DelayedTask(String taskName, long delayTime) {
this.taskName = taskName;
this.delayTime = System.currentTimeMillis() + delayTime;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(this.delayTime, ((DelayedTask) o).delayTime);
}
public void executeTask() {
// 执行任务逻辑
System.out.println("Task " + taskName + " executed!");
}
}
- 遅延キューを作成し、遅延タスクを追加します。
DelayQueue<DelayedTask> delayQueue = new DelayQueue<>();
// 添加延迟任务
delayQueue.offer(new DelayedTask("Task1", 3000));
delayQueue.offer(new DelayedTask("Task2", 5000));
delayQueue.offer(new DelayedTask("Task3", 1000));
- 遅延キューから期限切れのタスクを取り出し、消費者スレッドを作成して実行します。
Thread consumerThread = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
try {
DelayedTask task = delayQueue.take();
task.executeTask();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
consumerThread.start();
遅延キューは、タスクの遅延時間に応じて並べ替えられ、期限が最も早いタスクがキューの最前部に配置されます。消費者スレッドは期限が切れたタスクをキューから取り出して実行します。
Javaの遅延キューの利用例を示しました。実際の要件に応じて、遅延キューを柔軟に活用して、タイマータスクのスケジューリングなどの機能を実現できます。