DelayQueue小例子

来源:互联网 发布:制作电子报刊的软件 编辑:程序博客网 时间:2024/06/13 23:26

网吧上网:

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();    }}

这里写图片描述
从上面的运行结果可以看出,程序并没有一遍一遍地扫描队列中的对象,而是在队列中没有对象符合条件时阻塞。

原创粉丝点击