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

Wesley13
• 阅读 588

本人邮箱: kco1989@qq.com
欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代码已经全部托管github有需要的同学自行下载

引言

在银行排队办理业务,通常会有一个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<Human> queue;
    public ConsumerRunnable(PriorityBlockingQueue<Human> 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<Human> 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.而**小周***倒数第四个到,结果却第一个办理业务,有钱就是任性啊…


打赏

如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)
(十六)java多线程之优先队列PriorityBlockingQueue  (十六)java多线程之优先队列PriorityBlockingQueue

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java多线程(二)锁对象
转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47679007(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fxingjiarong%2Farticle%2Fdetails%2F4
Wesley13 Wesley13
2年前
Singleton 单例模式 -IOS开发
声明欢迎转载,但是请尊重作者劳动成果,转载请保留此框内声明,谢谢。文章出处:http://blog.csdn.net/iukey(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fiukey)Singleton单
Stella981 Stella981
2年前
Jetson TX1开发笔记(六):V4L2+OpenCV3.1以MJPG格式读取USB摄像头图像并实时显示
转载请注明作者和出处:http://blog.csdn.net/c406495762(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fc406495762)嵌入式平台(Target):JestonTX1OpenCV:
Wesley13 Wesley13
2年前
Java Mail
转载请注明出处:http://blog.csdn.net/qq\_26525215本文源自【大学之旅\_谙忆的博客(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fqq_26525215)】JavaMailAPI简介:
Stella981 Stella981
2年前
IntelliJ IDEA 开发技巧
转载请注明joymufeng,欢迎访问PlayScala社区(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.playscala.cn)(http://www.playscala.cn)原文链接:http://www.playscala.cn/article/view?
Stella981 Stella981
2年前
Linux下安装rabbitmq
原文地址,转载请注明出处: http://blog.csdn.net/qq\_34021712/article/details/72567786(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fqq_34021712%2Farticle%2Fdetails%
Stella981 Stella981
2年前
DeepLearning (三) 预处理:主成分分析与白化
【原创】Liu\_LongPo(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fllp1992) 转载请注明出处 【CSDN】http://blog.csdn.net/llp1992(https://www.oschina.net/action/G
Stella981 Stella981
2年前
Android开发之道(1)搭建开发环境以HelloWorld例程
转载请注明本文来自:编程艺术家Poechant的CSDN博客http://blog.csdn.net/poechant(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fpoechant)本人平日以后端开发为主业,最近对移动的应用层开发有些兴趣,
Wesley13 Wesley13
2年前
C#开发笔记之15
本文由 比特飞(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.byteflying.com%2F) 原创发布,欢迎大家踊跃转载。转载请注明本文地址:https://www.byteflying.com/archives/3412(https://www.os
Wesley13 Wesley13
2年前
Android在Service里播放与控制音乐
文章原创,转载请注明出处:http://blog.csdn.net/feifei454498130/article/details/9306631(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Ffeifei454498130%2Farticle%2Fdet