请你设计一个抢手机F码的排队的场景,并且需要显示等待时间

package com.example.demo1.service.impl;import lombok.Data;import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;@Data
public class User {//用户idprivate Integer id;//姓名private String name;//插入的时间private LocalDateTime date;}
package com.example.demo1.service.impl;import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;/*** 排队任务* 5秒内随机进来1个用户*/
public class PaiDuiTask implements Runnable{private AtomicInteger atomicInteger;private BlockingQueue<User> blockingQueue;public PaiDuiTask(BlockingQueue<User> blockingQueue){this.blockingQueue=blockingQueue;atomicInteger=new AtomicInteger(0);}@Overridepublic void run() {while (true){//设置每个用户的随机进来的时间int next=new Random().nextInt(5);try {Thread.sleep(1000*next);} catch (InterruptedException e) {throw new RuntimeException(e);}User user=new User();//用户id 自增user.setId(atomicInteger.getAndIncrement());user.setName("用户"+user.getId());//当前时间user.setDate(LocalDateTime.now());long miao=0;if(blockingQueue.peek()!=null){//获取队列中第一个元素的时间LocalDateTime oneTime=blockingQueue.peek().getDate();//当前时间减去队列中的时间 就是需要等待的时间miao = ChronoUnit.SECONDS.between(oneTime, user.getDate());}System.out.println(user.getName()+"进入排队中,需要等待"+miao+"秒");//把用户加入到队列中try {blockingQueue.put(user);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
package com.example.demo1.service.impl;import java.util.Random;
import java.util.concurrent.BlockingQueue;/*** 抢手机的任务* 从队列中取出数据*/
public class QiangTask implements Runnable{private BlockingQueue<User> blockingQueue;public QiangTask(BlockingQueue<User> blockingQueue){this.blockingQueue=blockingQueue;}@Overridepublic void run() {while (true){//从队列中取出用户信息User user = null;try {//如果队列是空的 就会一直阻塞user = blockingQueue.take();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(user.getName()+"正在处理");try {//假设每个用户处理间隔 随机5秒内int next=new Random().nextInt(5);Thread.sleep(1000*next);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(user.getName()+"处理完成");}}
}

测试类 定义线程池 把2个任务 放入线程池去执行

一边模拟用户进来,一边模拟用户进行抢购

package com.example.demo1.service.impl;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class Test {//自定义线程池public static ThreadPoolExecutor threadPoolExecutor(){//核心线程数int corePoolSize=20;//最大线程数int maximumPoolSize=100;//存活时间long keepAliveTime=60;//存活时间单位TimeUnit unit=TimeUnit.SECONDS;//阻塞队列BlockingQueue<Runnable> workQueu=new LinkedBlockingQueue<>(100);return new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueu);}public static void main(String[] args) {//获取线程池ThreadPoolExecutor executor=threadPoolExecutor();//链表阻塞队列BlockingQueue<User> blockingQueue=new LinkedBlockingQueue<>(100);//执行排队线程executor.execute(new PaiDuiTask(blockingQueue));//执行消费任务 抢购手机executor.execute(new QiangTask(blockingQueue));}
}

 可以看到,在用户等待的时候,会显示需要等待多少秒之后 才能抢到

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478382.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NestJS入门4:MySQL typeorm 增删改查

前文参考&#xff1a; NestJS入门1 NestJS入门2&#xff1a;创建模块 NestJS入门3&#xff1a;不同请求方式前后端写法 1. 安装数据库相关模块 npm install nestjs/typeorm typeorm mysql -S 2. MySql中创建数据库 ​ 3. 添加连接数据库代码 app.module.ts ​ import { M…

记 python opencv 没有指定参数名导致参数不生效的问题

Date: 2024-02-19 tags: OpenCVremapboardMode 省流&#xff1a;在使用opencv remap 函数时&#xff0c;需要明确指定参数名才能正确应用参数。 在验证OpenCV remap 函数时&#xff0c;有一个参数的含义是复制边缘像素&#xff08;BORDER_REPLICATE&#xff09;&#xff0c;也…

原生微信小程序开发记录

1. 拿到项目 先构建 2.小程序与普通网页开发的区别 网页开发渲染线程和脚本线程是互斥的&#xff0c;这也是为什么长时间的脚本运行可能会导致页面失去响应&#xff0c;而在小程序中&#xff0c;二者是分开的&#xff0c;分别运行在不同的线程中。网页开发者可以使用到各种浏览…

HTML世界核心

目录 一、基本文档(Basic Documentation) 二、基本标签(Basic Tags) 三、文本格式化(Formatting) 四、链接(Links) 五、图片(Images) 六、样式/区块(Styles/Sections) 七、无序列表(Disorder List) 八、有序列表(Sequence List) 九、定义列表(Definin…

开发消息多发工具需要用到的源代码

在数字化时代&#xff0c;消息传递是许多应用程序的核心功能之一&#xff0c;从社交媒体到企业通信&#xff0c;从个人聊天到群发消息&#xff0c;消息传递无处不在&#xff0c;为了满足这种需求&#xff0c;开发者经常需要创建或定制消息多发工具。 这些工具通常需要处理多个…

【ansible】自动化运维ansible之playbook剧本编写与运行

目录 一、ansible剧本playbook的组成 二、palybook的基础应用: 实操1&#xff1a;通过palybooks完成nginx的安装 第一种&#xff1a;通过yum安装nginx 第二种&#xff1a;通过编译安装nginx 实操2&#xff1a;playbook定义、引用变量​​​​​​​ 实操3&#xff1a;通过…

【9】知识存储

一、图数据库neo4j Neo4j是一个高性能的,NOSQL图形数据库&#xff0c;它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。单节点的服务器可承载上亿级的节点和关系&#xff0c;单节点性能不够时也可进行分布式集群部…

第一件事 什么是 Java 虚拟机 (JVM)

1、什么是虚拟机&#xff1f; - 这个其实是一个挺逗的事情&#xff0c;说白了&#xff0c;就是基于某个硬件架构&#xff0c;在这个硬件部署了一个操作系统&#xff0c;再构架一层虚拟的操作系统&#xff0c;这个新构架的操作系统就是虚拟机。 不知道的兄弟姐妹们&#xff0c;…

全国乙卷高考理科数学近年真题的选择题练一练和解析

虽然很多中小学才陆陆续续开学&#xff0c;但是高三的学子们一定是过年的时候也在抓紧备考&#xff0c;毕竟&#xff0c;距离2024年高考只剩下不到四个月了。 如何在最后四个月的时间提高成绩&#xff1f;以高考真题为抓手是一个不错的方法&#xff0c;因为真题都是严格遵循考试…

大数据信用报告查询方式一般有几种?哪种比较好?

在了解这个问题之前&#xff0c;想必你对大数据信用与人行信用的区别都是比较清楚了&#xff0c;本文呢就着重讲一下大数据信用报告查询方式有几种&#xff0c;哪种比较好&#xff0c;感兴趣的朋友不妨一起去看看。 大数据信用报告常见的三种查询方式&#xff1a; 一、二维码分…

处理MIGO 采购订单过账报错:物料账簿货币被更改

同事操作MIGO 采购订单过账报错&#xff1a;物料账簿货币被更改。 跟据查资料检查一下OKKP的配置。进去后发现了另一个报错&#xff1a; 然后再查资料&#xff0c;让检查一下SCC4的配置。经查看&#xff0c;发现是顾问copy client是忘记填写client的货币了。我维护好后&#xf…

ADS-B Receiver Module TT-SC1 for UAV and Drones

目录 Introduction Applications Main features Technical parameters Basic technical information Electrical specification Recommended operation conditions General electrical parameters Introduction TT-SC1 is a high quality and low price OEM ADS-B…