JavaのDelayQueueの使用方法は?
DelayQueueはJavaで使われる無限のブロッキングキューで、Delayedインターフェースを実装しており、要素は指定された時間の遅れ後に取り出されます。DelayQueueを使う手順は以下の通りです:
- DelayQueueオブジェクトを作成します。
- 遅延キュー(DelayQueue)には、DelayedElementオブジェクトを格納する遅延キュー変数delayQueueがあります。
- Delayedインターフェースを実装するDelayedElement要素クラスを作成します。
- public class DelayedElement implements Delayed {
private long delayTime; // 延迟時間
private long expireTime; // 到期時間
private String data; // データ// コンストラクタ
public DelayedElement(long delayTime, String data) {
this.delayTime = delayTime;
this.expireTime = System.currentTimeMillis() + delayTime;
this.data = data;
}// 残りの遅延時間を取得
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(expireTime – System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}// キュー要素のソート規則
@Override
public int compareTo(Delayed o) {
if (this.expireTime < ((DelayedElement) o).expireTime) { return -1; } else if (this.expireTime > ((DelayedElement) o).expireTime) {
return 1;
} else {
return 0;
}
}// 要素が期限切れかどうか
public boolean isExpired() {
return System.currentTimeMillis() >= expireTime;
}// データを取得
public String getData() {
return data;
}
} - DelayQueueに要素を追加します。
- delayQueue.offer(new DelayedElement(1000, “要素 1”)); // 1秒の遅延
delayQueue.offer(new DelayedElement(2000, “要素 2”)); // 2秒の遅延
… - DelayQueueから期限切れの要素を取り出す:
- delayQueueから要素を取り出して、DelayedElement delayedElementに代入し、そのデータをString型の変数dataに代入します。
重要なことは、take()メソッドはブロッキングメソッドであり、キューに要素がない場合は要素が到着するまで常にブロックされます。ブロックをせずに期限切れの要素を取得したい場合は、poll()メソッドを使用できます。
DelayedElementクラスのcompareTo()メソッドを書き直すことで、要素の並べ替えルールを指定し、どの要素が先に取り出されるかを決定することができます。前述の例では、要素の並べ替えルールは有効期限の順番に従って並べ替えられます。