DelayQueueは、BlockingQueueインターフェースの実装クラスであり、「遅延時間」に従ってキュー内の要素の処理優先度を決定します(つまり、キュー要素の「遅延時間」に従ってソートします)。もう1つの意味は、「遅延時間」を超える要素のみをキューから取り出して処理できるということです。
- DelayQueueキューは、要素オブジェクトに設定された遅延時間に達するまで、その要素オブジェクトがキューから取り出されないようにします。DelayQueueは、最後に期限切れになった要素をキューの先頭に格納します。期限切れの要素がキューにない場合、poll()メソッドを使用してキュー内の要素を取得するとnullが返されます。
- DelayQueueクラスとそのイテレーターは、CollectionおよびIteratorインターフェースのすべてのオプションのメソッドを実装しますが、iteratorメソッド
iterator()
は、DelayQueueの要素を特定の順序でトラバースすることを保証できません。
- DelayQueueはnull要素を受け取りません。DelayQueueはjava.util.concurrent.Delayedインターフェースを実装するオブジェクトのみを受け入れ、それらをキューに入れます。DelayQueueは、要素オブジェクトのgetDelay(TimeUnit)メソッドを呼び出すことにより、要素の残りの「遅延時間」を取得します。getDelay()のTimeUnit時間単位は、列挙型です:DAYS(日)、HOURS(時間)、MINUTES(分)、SECONDS(秒)、MILLISECONDS(ミリ秒)、MICROSECONDS(マイクロ秒)、NANOSECONDS(ナノ秒)
public interface Delayed extends Comparable{
long getDelay(TimeUnit unit);
}
次に、Delayedインターフェイスを実装するJavaクラスを記述し、Delayedインターフェイスを実装するクラスオブジェクトのみをDelayQueueに配置できます。DelayedインターフェースはComparableインターフェースを継承するため、getDelayメソッドとcompareToメソッドを実装する必要があります。
class DelayObject implements Delayed {
private String name;
private long time; //延时时间
public DelayObject(String name, long delayTime) {
this.name = name;
this.time = System.currentTimeMillis() + delayTime;
}
@Override
public long getDelay(TimeUnit unit) {
long diff = time - System.currentTimeMillis();
return unit.convert(diff, TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed obj) {
if (this.time < ((DelayObject)obj).time) {
return -1;
}
if (this.time > ((DelayObject)obj).time) {
return 1;
}
return 0;
}
@Override
public String toString() {
Date date = new Date(time);
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return "\nDelayObject:{"
+ "name=" + name
+ ", time=" + sd.format(date)
+ "}";
}
}
DelayQueueの使用効果をテストします
public class DelayQueueTest {
@Test
void testDelayObject() throws InterruptedException {
//实例化一个DelayQueue
BlockingQueue<DelayObject> DQ = new DelayQueue<>();
//向DelayQueue添加四个元素对象,注意延时时间不同
DQ.add(new DelayObject("A", 1000 * 10)); //延时10秒
DQ.add(new DelayObject("B", 4000 * 10)); //延时40秒
DQ.add(new DelayObject("C", 3000 * 10)); //延时30秒
DQ.add(new DelayObject("D", 2000 * 10)); //延时20秒
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//将对象从DelayQueue取出,注意取出的顺序与延时时间有关
System.out.println( DQ.take()); //取出A
System.out.println( DQ.take()); //取出D
System.out.println( DQ.take()); //取出C
System.out.println( DQ.take()); //取出B
}
}
以下の印刷結果と上記のコードから確認できます。
- キュー内の要素を配置する順序はA、B、C、Dであり、取り出す順序はA、D、C、Bです。これは、キュー内の要素が遅延時間に従ってソートされているためです。
- また、10秒ごとに要素をキューから取り出すことができることがわかります。これは、「遅延時間」を超える要素のみがキューから取り出せるためです。そして、私たちが設定した遅延時間は、10秒、20秒、30秒、40秒です。
DelayObject:{name=A, time=2021-03-23 14:14:20}
DelayObject:{name=D, time=2021-03-23 14:14:30}
DelayObject:{name=C, time=2021-03-23 14:14:40}
DelayObject:{name=B, time=2021-03-23 14:14:50}
私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります
- この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ。
あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!。また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。