Maison  >  Article  >  Java  >  Développement simultané multithread Java sur l'utilisation de DelayQueue

Développement simultané multithread Java sur l'utilisation de DelayQueue

黄舟
黄舟original
2017-09-20 09:56:141147parcourir

Cet article présente principalement en détail les exemples d'utilisation de DelayQueue dans le développement simultané multithread Java. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

lors de l'apprentissage du développement simultané multithread Java. processus, j'ai appris la fonction principale de la classe DelayQueue : il s'agit d'une BlockingQueue illimitée, utilisée pour placer des objets qui implémentent l'interface Delayed. Les objets qu'elle contient ne peuvent être supprimés de la file d'attente que lorsqu'ils expirent. Ce type de file d'attente est ordonné, c'est-à-dire que l'objet principal a le délai d'expiration retardé le plus long. Remarque : les éléments nuls ne peuvent pas être placés dans ce type de file d'attente.

Delayed, une interface de style mixte utilisée pour marquer les objets qui doivent être exécutés après un délai donné. Les implémentations de cette interface doivent définir une méthode compareTo qui fournit un classement cohérent avec la méthode getDelay de cette interface.

J'ai vu quelques exemples sur Internet et j'ai découvert que certains d'entre eux avaient des problèmes et ont apporté quelques modifications. J'espère que cela pourra aider tout le monde à comprendre.

Les Chinois aiment tous le karaoké. La plupart des gens rêvent de devenir chanteurs dans leur cœur, surtout lorsqu'ils étaient étudiants. Tout le monde aime former un groupe pour chanter à KTV. Ils chantent tout l'après-midi et tout le monde s'amuse bien. le temps de chanter. C'est à nouveau le Double 11 annuel, et de nombreux célibataires ont commencé à former des groupes et à venir chanter sur KTV. Alors, comment KTV facture-t-il le temps via le programme à ce moment-là ? Le code de simulation est le suivant :


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);
  }
}

Les résultats d'exécution sont les suivants :


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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn