Java並行プログラミングツールJUCパート3:DelayQueue遅延キュー

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}

私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります

  • この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ

あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。

おすすめ

転載: blog.csdn.net/hanxiaotongtong/article/details/115157074