本人邮箱: kco1989@qq.com
欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代码已经全部托管github有需要的同学自行下载
引言
在银行排队办理业务,通常会有一个VIP通道,让一些有VIP贵宾卡的优先办理业务,而不需要排队.这就是我们今天要讲的优先队列.
例子
假设在这么一个场景下,银行开始办理业务之前,已经来了20个客户,而且银行认为谁钱多,谁就优先办理业务.
-
首先创建一个
Human类,它包括姓名和存款两个属性public class Human {
1private int maney; 2private String name; 3public Human(int maney, String name){ 4 this.maney = maney; 5 this.name = name; 6} 7 8public int getManey() { 9 return maney; 10} 11 12public String getName() { 13 return name; 14} 15 16@Override 17public String toString() { 18 return getName() + "[存款:"+getManey()+"]"; 19}}
-
之后再增加一个比较
Human存款多少的类HumanComparatorpublic class HumanComparator implements Comparator<Human> { @Override public int compare(Human o1, Human o2) { return o2.getManey() - o1.getManey(); } }
-
再增加来排队的类
ProducerRunnablepublic class ProducerRunnable implements Runnable{ private static final String name = "明刚红李刘吕赵黄王孙朱曾游丽吴昊周郑秦丘"; private Random random = new Random(); private PriorityBlockingQueue<Human> queue; public ProducerRunnable(PriorityBlockingQueue<Human> queue) { this.queue = queue; }
1@Override 2public void run() { 3 for(int i = 0; i < 20; i ++){ 4 Human human = new Human(random.nextInt(10000), "小" + name.charAt(i)); 5 queue.put(human); 6 System.out.println(human + " 开始排队..."); 7 } 8}}
-
然后再增加办理业务的类
ConsumerRunnablepublic class ConsumerRunnable implements Runnable{
1private PriorityBlockingQueue<Human> queue; 2public ConsumerRunnable(PriorityBlockingQueue<Human> queue) { 3 this.queue = queue; 4} 5 6@Override 7public void run() { 8 while (true){ 9 Human take = queue.poll(); 10 if (take == null){ 11 break; 12 } 13 System.out.println(take + " 办理业务."); 14 } 15}}
-
ok,增加测试类
public class TestMain {
1public static void main(String[] args) throws InterruptedException { 2 3 PriorityBlockingQueue<Human> queue = new PriorityBlockingQueue<>(200, new HumanComparator()); 4 Thread thread = new Thread(new ProducerRunnable(queue)); 5 thread.start(); 6 thread.join(); 7 new Thread(new ConsumerRunnable(queue)).start(); 8}}
‘thread.join();’:先等20个来齐了,再开始办理业务额
运行结果:
1小明[存款:9296] 开始排队... 2小刚[存款:765] 开始排队... 3小红[存款:333] 开始排队... 4小李[存款:3912] 开始排队... 5小刘[存款:5732] 开始排队... 6小吕[存款:3714] 开始排队... 7小赵[存款:8439] 开始排队... 8小黄[存款:7330] 开始排队... 9小王[存款:9535] 开始排队... 10小孙[存款:1421] 开始排队... 11小朱[存款:8308] 开始排队... 12小曾[存款:5211] 开始排队... 13小游[存款:8264] 开始排队... 14小丽[存款:8383] 开始排队... 15小吴[存款:7664] 开始排队... 16小昊[存款:2715] 开始排队... 17小周[存款:9760] 开始排队... 18小郑[存款:8158] 开始排队... 19小秦[存款:869] 开始排队... 20小丘[存款:1806] 开始排队... 21小周[存款:9760] 办理业务. 22小王[存款:9535] 办理业务. 23小明[存款:9296] 办理业务. 24小赵[存款:8439] 办理业务. 25小丽[存款:8383] 办理业务. 26小朱[存款:8308] 办理业务. 27小游[存款:8264] 办理业务. 28小郑[存款:8158] 办理业务. 29小吴[存款:7664] 办理业务. 30小黄[存款:7330] 办理业务. 31小刘[存款:5732] 办理业务. 32小曾[存款:5211] 办理业务. 33小李[存款:3912] 办理业务. 34小吕[存款:3714] 办理业务. 35小昊[存款:2715] 办理业务. 36小丘[存款:1806] 办理业务. 37小孙[存款:1421] 办理业务. 38小秦[存款:869] 办理业务. 39小刚[存款:765] 办理业务. 40小红[存款:333] 办理业务.
通过结果你会发现,有钱就是老大啊!!!小周跌二个来,结果却倒数第二个办理业务,只因为他是穷B.而小周*倒数第四个到,结果却第一个办理业务,有钱就是任性啊…
打赏
如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)

