在银行排队办理业务,通常会有一个VIP通道,让一些有VIP贵宾卡的优先办理业务,而不需要排队.这就是我们今天要讲的优先队列.
假设在这么一个场景下,银行开始办理业务之前,已经来了20个客户,而且银行认为谁钱多,谁就优先办理业务.
首先创建一个Human类,它包括姓名和存款两个属性public class Human { private int maney; private String name; public Human(int maney, String name){ this.maney = maney; this.name = name; } public int getManey() { return maney; } public String getName() { return name; } @Override public String toString() { return getName() + "[存款:"+getManey()+"]"; } }之后再增加一个比较Human存款多少的类HumanComparator
public class HumanComparator implements Comparator再增加来排队的类 ProducerRunnable{ @Override public int compare(Human o1, Human o2) { return o2.getManey() - o1.getManey(); } }
public class ProducerRunnable implements Runnable{ private static final String name = "明刚红李刘吕赵黄王孙朱曾游丽吴昊周郑秦丘"; private Random random = new Random(); private PriorityBlockingQueue然后再增加办理业务的类 ConsumerRunnablequeue; public ProducerRunnable(PriorityBlockingQueue queue) { this.queue = queue; } @Override public void run() { for(int i = 0; i < 20; i ++){ Human human = new Human(random.nextInt(10000), "小" + name.charAt(i)); queue.put(human); System.out.println(human + " 开始排队..."); } } }
public class ConsumerRunnable implements Runnable{ private PriorityBlockingQueueok,增加测试类queue; public ConsumerRunnable(PriorityBlockingQueue queue) { this.queue = queue; } @Override public void run() { while (true){ Human take = queue.poll(); if (take == null){ break; } System.out.println(take + " 办理业务."); } } }
public class TestMain { public static void main(String[] args) throws InterruptedException { PriorityBlockingQueuequeue = new PriorityBlockingQueue<>(200, new HumanComparator()); Thread thread = new Thread(new ProducerRunnable(queue)); thread.start(); thread.join(); new Thread(new ConsumerRunnable(queue)).start(); } }
‘thread.join();’:先等20个来齐了,再开始办理业务额
运行结果:
小明[存款:9296] 开始排队... 小刚[存款:765] 开始排队... 小红[存款:333] 开始排队... 小李[存款:3912] 开始排队... 小刘[存款:5732] 开始排队... 小吕[存款:3714] 开始排队... 小赵[存款:8439] 开始排队... 小黄[存款:7330] 开始排队... 小王[存款:9535] 开始排队... 小孙[存款:1421] 开始排队... 小朱[存款:8308] 开始排队... 小曾[存款:5211] 开始排队... 小游[存款:8264] 开始排队... 小丽[存款:8383] 开始排队... 小吴[存款:7664] 开始排队... 小昊[存款:2715] 开始排队... 小周[存款:9760] 开始排队... 小郑[存款:8158] 开始排队... 小秦[存款:869] 开始排队... 小丘[存款:1806] 开始排队... 小周[存款:9760] 办理业务. 小王[存款:9535] 办理业务. 小明[存款:9296] 办理业务. 小赵[存款:8439] 办理业务. 小丽[存款:8383] 办理业务. 小朱[存款:8308] 办理业务. 小游[存款:8264] 办理业务. 小郑[存款:8158] 办理业务. 小吴[存款:7664] 办理业务. 小黄[存款:7330] 办理业务. 小刘[存款:5732] 办理业务. 小曾[存款:5211] 办理业务. 小李[存款:3912] 办理业务. 小吕[存款:3714] 办理业务. 小昊[存款:2715] 办理业务. 小丘[存款:1806] 办理业务. 小孙[存款:1421] 办理业务. 小秦[存款:869] 办理业务. 小刚[存款:765] 办理业务. 小红[存款:333] 办理业务.
通过结果你会发现,有钱就是老大啊!!!小周跌二个来,结果却倒数第二个办理业务,只因为他是穷B.而小周*倒数第四个到,结果却第一个办理业务,有钱就是任性啊…