DelayQueue小例子

網吧上網:

package Test1;

import java.util.Calendar;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class DelayQueueTest implements Runnable {
    DelayQueue<Customer1> queue = new DelayQueue<Customer1>();

    public void onCumputer(Integer id, String name, Integer money) {
        Customer1 customer = new Customer1(id, name, money);
        queue.put(customer);
        System.out.println("身份證:" + id + "姓名:" + name + "上機時間" + money);
    }

    public void outCumputer(Customer1 customer) {
        System.out.println("身份證:" + customer.getId() + "姓名:" + customer.getName() + "下機");
    }

    @Override
    public void run() {
        while (true) {
            System.out.println("檢查.....");
            try {
                Customer1 customer = queue.take();
                outCumputer(customer);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {

        DelayQueueTest queueTest = new DelayQueueTest();
        System.out.println("開始營業...");
        new Thread(queueTest).start();
        queueTest.onCumputer(123, "張三", 3);
        queueTest.onCumputer(124, "張三", 5);
        queueTest.onCumputer(126, "張三", 10);
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Calendar.getInstance().get(Calendar.SECOND));
        }

    }

}

class Customer1 implements Delayed {
    // 身份證號
    private Integer id;
    // 姓名
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 下機時間 一元一秒
    private long endTime;

    public Customer1(Integer id, String name, Integer money) {
        this.id = id;
        this.name = name;
        this.endTime = money * 1000 + System.currentTimeMillis();
    }

    // 設置優先級
    @Override
    public int compareTo(Delayed o) {
        Customer1 c = (Customer1) o;
        return this.endTime - c.endTime > 0 ? 1 : (this.endTime - c.endTime < 0 ? -1 : 0);
    }

    // 判斷過期時間
    @Override
    public long getDelay(TimeUnit unit) {

        return this.endTime - System.currentTimeMillis();
    }

}

這裏寫圖片描述
從上面的運行結果可以看出,程序並沒有一遍一遍地掃描隊列中的對象,而是在隊列中沒有對象符合條件時阻塞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章