DelayQueue怎么在Java多線程并發(fā)開發(fā)中使用

這篇文章給大家介紹DelayQueue怎么在Java多線程并發(fā)開發(fā)中使用,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的鎮(zhèn)安網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

Delayed,一種混合風格的接口,用來標記那些應(yīng)該在給定延遲時間之后執(zhí)行的對象。此接口的實現(xiàn)必須定義一個 compareTo 方法,該方法提供與此接口的 getDelay 方法一致的排序。

在網(wǎng)上看到了一些示例,發(fā)現(xiàn)有的示例存在一些問題,做了些修改,希望能幫助大家理解。

中國人都喜歡K歌,大部分人的內(nèi)心都住著一個歌手的夢,尤其是學(xué)生時代,大家都喜歡組團去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正常營業(yè)");
      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 &#63; 1 :(endTime - s.endTime == 0 &#63; 0 : -1);
  }
}

運行的結(jié)果如下:

KTV正常營業(yè)
================================
張三 等人交了500元錢,進入111號包廂,開始K歌...
李四 等人交了200元錢,進入666號包廂,開始K歌...
王五 等人交了100元錢,進入888號包廂,開始K歌...
================================
李四 等人所在的666號包廂,時間到...
王五 等人所在的888號包廂,時間到...
張三 等人所在的111號包廂,時間到...

關(guān)于DelayQueue怎么在Java多線程并發(fā)開發(fā)中使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

文章標題:DelayQueue怎么在Java多線程并發(fā)開發(fā)中使用
當前地址:http://muchs.cn/article40/ihceho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站靜態(tài)網(wǎng)站、網(wǎng)站營銷網(wǎng)站維護、網(wǎng)站排名網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)