资讯专栏INFORMATION COLUMN

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

helloworldcoding / 320人阅读

摘要:本人邮箱欢迎转载转载请注明网址代码已经全部托管有需要的同学自行下载引言在银行排队办理业务通常会有一个通道让一些有贵宾卡的优先办理业务而不需要排队这就是我们今天要讲的优先队列例子假设在这么一个场景下银行开始办理业务之前已经来了个客户而且银行认

本人邮箱:
欢迎转载,转载请注明网址 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 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.而小周*倒数第四个到,结果却第一个办理业务,有钱就是任性啊...

打赏

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69963.html

相关文章

  • Java线程进阶(三四)—— J.U.Ccollections框架:PriorityBlocki

    摘要:初始状态对应二叉树结构将顶点与最后一个结点调换即将顶点与最后一个结点交换,然后将索引为止置。 showImg(https://segmentfault.com/img/bVbgOtL?w=1600&h=800); 本文首发于一世流云专栏:https://segmentfault.com/blog... 一、PriorityBlockingQueue简介 PriorityBlockin...

    levius 评论0 收藏0
  • Java线程进阶(三六)—— J.U.Ccollections框架:DelayQueue

    摘要:之后,会重复上一步,新唤醒的线程可能取代成为新的线程。这其实是一种名为的多线程设计模式。我们之前说了,线程作用之一就是用来唤醒其它无限等待的线程,所以必须要有这个判断。线程池框架中的就是一种延时阻塞队列。 showImg(https://segmentfault.com/img/bVbgVHV?w=1600&h=1067); 本文首发于一世流云专栏:https://segmentfau...

    enda 评论0 收藏0
  • Java线程进阶(一)—— J.U.C并发包概述

    摘要:整个包,按照功能可以大致划分如下锁框架原子类框架同步器框架集合框架执行器框架本系列将按上述顺序分析,分析所基于的源码为。后,根据一系列常见的多线程设计模式,设计了并发包,其中包下提供了一系列基础的锁工具,用以对等进行补充增强。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首发于一世流云专栏:https...

    anonymoussf 评论0 收藏0
  • java 队列

    摘要:是基于链接节点的线程安全的队列。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。队列内部仅允许容纳一个元素。该队列的头部是延迟期满后保存时间最长的元素。 队列简述 Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。...

    goji 评论0 收藏0
  • 初识Queue队列

    摘要:架构师入门笔记三初识队列和模拟基础知识线程通信概念线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理,就不能成为一个整体,线程之间的通信就成为整体的必用方法之一。它是一个基于链接节点的无界限线程安全队列。 架构师入门笔记三 初识Queue队列 wait和notify模拟Queue wait/notify 基础知识 线程通信概念:线程是操作系统中独立的个体,但这些个体如果不经过特...

    Miracle_lihb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<