欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程并發(fā)開發(fā)之DelayQueue使用示例

 更新時間:2017年09月19日 17:13:38   作者:生活半篇記  
這篇文章主要為大家詳細介紹了Java多線程并發(fā)開發(fā)之DelayQueue使用示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在學習Java 多線程并發(fā)開發(fā)過程中,了解到DelayQueue類的主要作用:是一個無界的BlockingQueue,用于放置實現(xiàn)了Delayed接口的對象,其中的對象只能在其到期時才能從隊列中取走。這種隊列是有序的,即隊頭對象的延遲到期時間最長。注意:不能將null元素放置到這種隊列中。

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JdbcTemplate操作數(shù)據(jù)庫的具體方法

    JdbcTemplate操作數(shù)據(jù)庫的具體方法

    這篇文章主要介紹了JdbcTemplate操作數(shù)據(jù)庫的具體操作方法,準備工作需要大家先導(dǎo)入相關(guān)的jar包,建個數(shù)據(jù)庫,具體操作方法跟隨小編一起看看吧
    2022-03-03
  • 一文帶你厲害Java設(shè)計模式中的模板方法

    一文帶你厲害Java設(shè)計模式中的模板方法

    模板方法定義了一個算法的步驟,并允許子類為一個或多個步驟提供實現(xiàn)。這篇文章就來帶大家了解一下Java模板方法的概念與實現(xiàn),感興趣的小伙伴可以跟隨小編一起學習一下
    2023-01-01
  • Maven一鍵部署Springboot到Docker倉庫為自動化做準備(推薦)

    Maven一鍵部署Springboot到Docker倉庫為自動化做準備(推薦)

    這篇文章主要介紹了Maven一鍵部署Springboot到Docker倉庫,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot工程打包后執(zhí)行Java?-Jar就能啟動的步驟原理

    SpringBoot工程打包后執(zhí)行Java?-Jar就能啟動的步驟原理

    這篇文章主要介紹了SpringBoot工程打包后為何執(zhí)行Java?-Jar就能啟動,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 詳解Spring MVC的攔截器與異常處理機制

    詳解Spring MVC的攔截器與異常處理機制

    這篇文章主要為大家詳細介紹了Spring MVC的攔截器與異常處理機制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 詳解Spring mvc的web.xml配置說明

    詳解Spring mvc的web.xml配置說明

    本篇文章主要介紹了Spring mvc的web.xml配置說明,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • spring-mvc/springboot使用MockMvc對controller進行測試

    spring-mvc/springboot使用MockMvc對controller進行測試

    這篇文章主要介紹了spring-mvc/springboot使用MockMvc對controller進行測試,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • SpringBoot整合Quartz方法詳解

    SpringBoot整合Quartz方法詳解

    這篇文章詳解介紹了SpringBoot整合Quartz的方法,Quartz是一個比較成熟了的定時任務(wù)框架,本文實例代碼給大家詳細講解,需要的朋友可以參考下
    2023-04-04
  • SpringBoot yaml語法與數(shù)據(jù)讀取操作詳解

    SpringBoot yaml語法與數(shù)據(jù)讀取操作詳解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標記語言)的遞歸縮寫。在開發(fā)的這種語言時,YAML 的意思其實是:“Yet Another Markup Language”(仍是一種標記語言),本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • 解決Test類中不能使用Autowired注入bean的問題

    解決Test類中不能使用Autowired注入bean的問題

    這篇文章主要介紹了解決Test類中不能使用Autowired注入bean的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論