> Java > java지도 시간 > DelayQueue 사용에 관한 Java 다중 스레드 동시 개발

DelayQueue 사용에 관한 Java 다중 스레드 동시 개발

黄舟
풀어 주다: 2017-09-20 09:56:14
원래의
1188명이 탐색했습니다.

이 글은 주로 Java 다중 스레드 동시 개발에서 DelayQueue의 사용 예를 자세히 소개합니다. 관심 있는 친구는 참고할 수 있습니다.

Java 다중 스레드 동시 개발을 배우는 과정에서 DelayQueue에 대해 배웠습니다. 클래스의 주요 기능: Delayed 인터페이스를 구현하는 객체를 배치하는 데 사용되는 제한되지 않은 BlockingQueue입니다. 해당 객체는 만료될 때만 대기열에서 제거될 수 있습니다. 이러한 종류의 대기열은 순서가 지정됩니다. 즉, 헤드 개체의 지연된 만료 시간이 가장 길습니다. 참고: null 요소는 이러한 종류의 대기열에 배치될 수 없습니다.

Delayed는 지정된 지연 시간 후에 실행되어야 하는 개체를 표시하는 데 사용되는 혼합 스타일 인터페이스입니다. 이 인터페이스의 구현에서는 이 인터페이스의 getDelay 메소드와 일치하는 순서를 제공하는 CompareTo 메소드를 정의해야 합니다.

인터넷에서 몇 가지 예를 보고 일부 문제가 있는 것을 발견하여 모두가 이해하는 데 도움이 되기를 바랍니다.

중국 사람들은 모두 노래방을 좋아합니다. 특히 학생 시절에는 모두가 노래방에서 노래하는 것을 좋아하며 모두가 즐거운 시간을 보냅니다. 매년 더블 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号包厢,时间到...
로그인 후 복사

위 내용은 DelayQueue 사용에 관한 Java 다중 스레드 동시 개발의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿