Heim  >  Artikel  >  Java  >  Java-Multithread-Parallelentwicklung über die Verwendung von DelayQueue

Java-Multithread-Parallelentwicklung über die Verwendung von DelayQueue

黄舟
黄舟Original
2017-09-20 09:56:141158Durchsuche

In diesem Artikel werden hauptsächlich die Anwendungsbeispiele von DelayQueue in der gleichzeitigen Java-Multithread-Entwicklung vorgestellt. Interessierte Freunde können sich beim Erlernen der gleichzeitigen Java-Multithread-Entwicklung darauf beziehen Im Prozess habe ich die Hauptfunktion der DelayQueue-Klasse kennengelernt: Es handelt sich um eine unbegrenzte BlockingQueue, die zum Platzieren von Objekten verwendet wird, die die Delayed-Schnittstelle implementieren. Die darin enthaltenen Objekte können nur aus der Warteschlange entfernt werden, wenn sie ablaufen. Diese Art von Warteschlange ist geordnet, das heißt, das Kopfobjekt hat die längste verzögerte Ablaufzeit. Hinweis: Nullelemente können nicht in diese Art von Warteschlange gestellt werden.

Verzögert, eine Schnittstelle im gemischten Stil, die zum Markieren von Objekten verwendet wird, die nach einer bestimmten Verzögerungszeit ausgeführt werden sollen. Implementierungen dieser Schnittstelle müssen eine CompareTo-Methode definieren, die eine mit der getDelay-Methode dieser Schnittstelle konsistente Reihenfolge bereitstellt.

Ich habe einige Beispiele im Internet gesehen und festgestellt, dass einige davon Probleme hatten, und habe einige Änderungen vorgenommen. Ich hoffe, es kann allen helfen, es zu verstehen.

Die meisten Chinesen träumen davon, Sänger zu werden, besonders als sie noch Studenten waren. Sie singen den ganzen Nachmittag und jeder hat Spaß daran Zeit zum Singen. Es ist wieder das alljährliche Double 11 und viele Singles haben begonnen, Gruppen zu bilden und zum Singen zu KTV zu kommen. Wie berechnet KTV zu diesem Zeitpunkt die Zeit durch das Programm? Der Simulationscode lautet wie folgt:


Die laufenden Ergebnisse sind wie folgt:
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);
  }
}


Das obige ist der detaillierte Inhalt vonJava-Multithread-Parallelentwicklung über die Verwendung von DelayQueue. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn