java 线程池 优先队列_(十六)java多线程之优先队列PriorityBlockingQueue

引言

在银行排队办理业务,通常会有一个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 {

@Override

public int compare(Human o1, Human o2) {

return o2.getManey() - o1.getManey();

}

}

再增加来排队的类 ProducerRunnable

public class ProducerRunnable implements Runnable{

private static final String name = "明刚红李刘吕赵黄王孙朱曾游丽吴昊周郑秦丘";

private Random random = new Random();

private PriorityBlockingQueue queue;

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 + " 开始排队...");

}

}

}

然后再增加办理业务的类 ConsumerRunnable

public class ConsumerRunnable implements Runnable{

private PriorityBlockingQueue 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 + " 办理业务.");

}

}

}

ok,增加测试类

public class TestMain {

public static void main(String[] args) throws InterruptedException {

PriorityBlockingQueue queue = 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.而小周*倒数第四个到,结果却第一个办理业务,有钱就是任性啊...

打赏

如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)

bd888cd6ef70d77332dceb4f486d4581.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值