引言

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

打赏

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

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

  1. executor线程池框架_如何使用Java 5 Executor框架创建线程池

    executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...

  2. java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例

    并发主题 使用Executors 和 ThreadPoolExecutor实现Java线程池案例 首先需要一个工作线程: package com.journaldev.threadpool; publ ...

  3. java线程池拒绝策略_Java核心知识 多线程并发 线程池原理(二十三)

    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行.他 ...

  4. java 线程池超时_线程池中如何控制超时时间?

    线程池构造方法不能控制任务的超时时间, java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java. ...

  5. java 等待线程池结束_如何等待java线程池中所有任务完成

    一.等待线程池所有线程完成: 有时候我们需要等待java thread pool中所有任务完成后再做某些操作,如想要等待所有任务完成,仅需调用threadPool.awaitTermination() ...

  6. java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?

    在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...

  7. java 线程池 状态_【Java多线程】线程状态、线程池状态

    线程状态: 线程共包括以下5种状态. 1. 新建状态(New)线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable)也 ...

  8. java线程工作原型_深度解析Java内存的原型及工作原理

    本文主要通过分析Java内存分配的栈.堆以以及常量池详细的讲解了其的工作原理. 一.java虚拟机内存原型 寄存器:我们在程序中无法控制栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是 ...

  9. java 线程一直运行状态_详解JAVA 线程-线程的状态有哪些?它是如何工作的?

    线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...

最新文章

  1. 爱送礼成中国好前任,谢谢你让我认识了快递员
  2. 部署一个完整的vue webpack项目
  3. 计算机硬件选型报价,组装电脑硬件该怎么选择?这几个硬件要舍得花钱,千万别买错了!...
  4. (总结5)H5中新增的功能性事件
  5. 初识JAVA--foreach语句的应用
  6. linux下golang编译环境搭建
  7. c语言地震子波6,地震子波反褶积程序
  8. 苹果手机的隔空投送怎么使用?
  9. python源码中的学习笔记_第11章_模块与包
  10. 王道训练营 Java 部分测试
  11. 小技巧分享:Sourcetree 免登录注册破解教程
  12. 为什么一打电话就显示服务器故障,手机打电话黑屏怎么回事?手机打电话时出现黑屏情况的解决办法介绍...
  13. RF天线设计的一些概念
  14. shell批量修改文件后缀名
  15. 【补档2017.12.28】我的2017-漫长的苦痛与渐入佳境的愤怒
  16. PyQt5数据库开发2 5.1 QSqlQueryModel
  17. android dataBinding 与ObservableField实现双向绑定
  18. MVVM 和 VUE三要素:响应式、模板引擎、渲染
  19. java计算机毕业设计基于Ssm学生信息管理系统源程序+mysql+系统+lw文档+远程调试
  20. 非常不错的学习网站——技术胖

热门文章

  1. 【XAI】Nettack IG-JSMA
  2. html阅读器 怎样卸载,怎样彻底卸载掉金山pdf阅读器?
  3. 自定义maven archetype,上传到nexus,并使用nexus远程的archetype创建项目
  4. 用OLED显示屏显示文字
  5. ReLU函数 Vs Sigmoid 函数——XOR问题究竟用那个好
  6. 暑假集训总结——区间DP,堆的概念及应用,STL(vector、set、pair、map、priority_queue),hash表,树状数组,图论
  7. 下载卫星影像地图软件哪个好用?
  8. vue 父组件、子组件对象改变_VUE里子组件获取父组件动态变化的值
  9. 阿德莱德大学计算机考研专业,阿德莱德大学研究生学制是几年?
  10. 用CSS来实现一些动画在vue中使用之地球旋转(2)