Java マルチスレッド同時開発 DelayQueue の使用について

黄舟
リリース: 2017-09-20 09:56:14
オリジナル
1155 人が閲覧しました

この記事では主に Java マルチスレッド同時開発における DelayQueue の使用例を詳しく紹介します。興味のある方は参考にしてください。

Java マルチスレッド同時開発を学ぶ過程で、DelayQueue について学びました。クラスの主な機能: これは、Delayed インターフェイスを実装するオブジェクトを配置するために使用される、制限のない BlockingQueue です。そのオブジェクトは、有効期限が切れたときにのみキューから削除できます。この種類のキューは順序付けされています。つまり、先頭オブジェクトの有効期限遅延時間が最も長くなります。注: null 要素をこの種のキューに入れることはできません。

Delayed、指定された遅延時間の後に実行されるオブジェクトをマークするために使用される混合スタイルのインターフェイス。このインターフェイスの実装では、このインターフェイスの getDelay メソッドと一貫した順序付けを提供する CompareTo メソッドを定義する必要があります。

インターネットでいくつかの例を見たところ、いくつかの問題があることがわかったので、皆さんの理解に役立つことを願っていくつか修正しました。

中国人はみんなカラオケが好きで、特に学生時代はみんなグループを作ってKTVで歌い、楽しい時間を過ごしています。今年も毎年恒例のダブル 11 が開催され、多くの独身者がグループを結成して KTV に来て歌い始めています。では、この時点で KTV はプログラムを通じてどのように時間をチャージするのでしょうか? シミュレーション コードは次のとおりです:


public class KTV implements Runnable{
  private DelayQueue<KTVConsumer> queue = new DelayQueue<>();

  public void begin(String name,String boxNum,int money){

    KTVConsumer man = new KTVConsumer(name,boxNum,20l*money+System.currentTimeMillis());
    System.out.println(man.getName()+" 等人交了"+money+"元钱,进入"+man.getBoxNum()+"号包厢,开始K歌...");
    this.queue.add(man);
  }

  public void end(KTVConsumer man){
    System.out.println(man.getName()+" 等人所在的"+man.getBoxNum()+"号包厢,时间到...");
  }

  @Override
  public void run() {
    // TODO Auto-generated method stub
    while(true){
      try {
        KTVConsumer man = queue.take();
        end(man);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

  public static void main(String args[]){
    try{
      System.out.println("KTV正常营业");
      System.out.println("================================");
      KTV ktv = new KTV();
      Thread sing = new Thread(ktv);
      sing.start();
      new Thread(new Runnable() {
        @Override
        public void run() {
          ktv.begin("张三", "111", 500);
        }
      }).start();

      new Thread(new Runnable() {
        @Override
        public void run() {
          ktv.begin("李四", "666", 200);
        }
      }).start();

      Thread.sleep(2000);
      new Thread(new Runnable() {
        @Override
        public void run() {
          ktv.begin("王五", "888", 100);
          System.out.println("================================");
        }
      }).start();

    }
    catch(Exception ex){

    }

  }
}
public class KTVConsumer implements Delayed{
  private String name;
  //截止时间
  private long endTime;
  //包厢号
  private String boxNum;

  public KTVConsumer(String name,String boxNum,long endTime){
    this.name=name;
    this.boxNum=boxNum;
    this.endTime=endTime;
  }

  public String getName(){
    return this.name;
  }

  public String getBoxNum(){
    return this.boxNum;
  }

  /**
   * 用来判断是否到了截止时间
   */
  @Override
  public long getDelay(TimeUnit unit) {
    // TODO Auto-generated method stub
    return unit.convert(endTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
  }

  /**
   * 相互比较排序用
   */
  @Override
  public int compareTo(Delayed o) {
    // TODO Auto-generated method stub
    if(o == null || ! (o instanceof KTVConsumer)) return 1;
    if(o == this) return 0;
    KTVConsumer s = (KTVConsumer)o;
    return endTime - s.endTime > 0 ? 1 :(endTime - s.endTime == 0 ? 0 : -1);
  }
}
ログイン後にコピー

実行結果は次のとおりです:


KTV正常营业
================================
张三 等人交了500元钱,进入111号包厢,开始K歌...
李四 等人交了200元钱,进入666号包厢,开始K歌...
王五 等人交了100元钱,进入888号包厢,开始K歌...
================================
李四 等人所在的666号包厢,时间到...
王五 等人所在的888号包厢,时间到...
张三 等人所在的111号包厢,时间到...
ログイン後にコピー

以上がJava マルチスレッド同時開発 DelayQueue の使用についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート