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.而小周*倒数第四个到,结果却第一个办理业务,有钱就是任性啊...
打赏
如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)
java 线程池 优先队列_(十六)java多线程之优先队列PriorityBlockingQueue相关推荐
- executor线程池框架_如何使用Java 5 Executor框架创建线程池
executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...
- java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例
并发主题 使用Executors 和 ThreadPoolExecutor实现Java线程池案例 首先需要一个工作线程: package com.journaldev.threadpool; publ ...
- java线程池拒绝策略_Java核心知识 多线程并发 线程池原理(二十三)
线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行.他 ...
- java 线程池超时_线程池中如何控制超时时间?
线程池构造方法不能控制任务的超时时间, java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java. ...
- java 等待线程池结束_如何等待java线程池中所有任务完成
一.等待线程池所有线程完成: 有时候我们需要等待java thread pool中所有任务完成后再做某些操作,如想要等待所有任务完成,仅需调用threadPool.awaitTermination() ...
- java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?
在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...
- java 线程池 状态_【Java多线程】线程状态、线程池状态
线程状态: 线程共包括以下5种状态. 1. 新建状态(New)线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable)也 ...
- java线程工作原型_深度解析Java内存的原型及工作原理
本文主要通过分析Java内存分配的栈.堆以以及常量池详细的讲解了其的工作原理. 一.java虚拟机内存原型 寄存器:我们在程序中无法控制栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是 ...
- java 线程一直运行状态_详解JAVA 线程-线程的状态有哪些?它是如何工作的?
线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...
最新文章
- 【安全加密技术】 对称加密
- 【转】IOS的各种后台情况的实现
- SQL Server 2005——下一代的数据管理和分析软件[转]
- python都学什么啊-Python到底有什么用?为什么那么多人都在学Python?
- IBASE logical view和physical view
- 正则表达式 guava_带有正则表达式模式的Google Guava Cache
- ajax请求模拟登录
- Android官方开发文档Training系列课程中文版:通知用户之更新或移除通知
- 判断字符串格式_Python基础教程,第四讲,字符串详解
- 电脑上怎么做pdf文件_怎么合并PDF文件?PDF合并软件哪个好?
- 开源linux 二进制工具,又一款开源好物:逐字节分析的二进制数据分析工具bitinsight...
- centos5.5+NAT+Squid透明代理总结
- mysql 导出er图工具_mysql 反向生成 er图
- sql中的大于小于等于的表示
- 面试前夕,我建议你还是先来看看阿里和京东面试都问些啥?
- 一款仿网易云音乐Java开源系统(附源码)
- week2.2数组方法及封装——每天一个JS小总结
- Spring的前世今生: Spring5.0已经出来了,Springboot已经风靡全球, Spring怎么一步一步走过来的, 让我们看看其前世今生~~~
- 网页更新提醒官方教程(插件安装)
- 玩机搞机----安卓全机型修改 开机动画 步骤教程
热门文章
- oracle簇和簇表的创建,Oracle教程之管理表(七)--Oracle分区表及簇表的建立
- rx 6700xt性能相当于什么水平 rx 6700XT参数
- 浅谈执行力文化(zt)
- lammps模拟中tersoff势设置方法
- java ethereum_EthereumJ是Ethereum协议的纯java实现
- HBuildX 打包说明(网站链接打包apk(app))
- Idea Lambda expressions are not supported at language level '5'
- OpenPifPaf decode源码解析
- PB中OpenSheet与open的区别
- pandas一行代码绘制26种美图