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

news2025/1/15 18:00:21
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 {

    //用户id
    private 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);
    }

    @Override
    public 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;
    }

    @Override
    public 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.coloradmin.cn/o/1459051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NestJS入门8:拦截器

前文参考&#xff1a; NestJS入门1&#xff1a;创建项目 NestJS入门2&#xff1a;创建模块 NestJS入门3&#xff1a;不同请求方式前后端写法 NestJS入门4&#xff1a;MySQL typeorm 增删改查 NestJS入门5&#xff1a;加入Swagger NestJS入门6&#xff1a;日志中间件 Nes…

2023年便宜的云服务器分享:最低26元4核16G

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

新手搭建服装小程序全攻略

随着互联网的快速发展&#xff0c;线上购物已经成为了人们日常生活中不可或缺的一部分。服装作为人们日常消费的重要品类&#xff0c;线上化趋势也日益明显。本文将详细介绍如何从零开始搭建一个服装小程序商城&#xff0c;从入门到精通的捷径&#xff0c;帮助你快速掌握小程序…

认识TypeScript 中的接口和类

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 接口 类 江城开朗的豌豆 在 TypeScript 中&…

Linux小程序--进度条

目录 1.知识补充 1.1回车和换行 1.2缓冲区 2.实现倒计时 3.实现进度条 1.知识补充 1.在制作小程序进度条之前&#xff0c;我们先了解一下&#xff0c;回车换行和行缓冲区的概念。 2.动态效果&#xff0c;在同一个位置刷新不同的图像&#xff0c;实现一个倒计时的效果。…

Stable Diffusion——基础模型、VAE、LORA、Embedding各个模型的介绍与使用方法

前言 Stable Diffusion&#xff08;稳定扩散&#xff09;是一种生成模型&#xff0c;基于扩散过程来生成高质量的图像。它通过一个渐进过程&#xff0c;从一个简单的噪声开始&#xff0c;逐步转变成目标图像&#xff0c;生成高保真度的图像。这个模型的基础版本是基于扩散过程…

剪辑视频调色软件有哪些 剪辑视频软件哪个最好 剪辑视频怎么学 剪辑视频的方法和步骤 会声会影2024 会声会影视频制作教程

看了很多调色教程&#xff0c;背了一堆调色参数&#xff0c;可最终还是调不出理想的效果。别再怀疑自己了&#xff0c;不是你的剪辑技术不行&#xff0c;而是剪辑软件没选对。只要掌握了最基本的调色原理&#xff0c;一款适合自己的视频剪辑软件是很容易出片的。 有关剪辑视频…

3个密码学相关的问题

一、离散对数问题&#xff08;Discrete Logarithm Problem, DLP&#xff09; 问题描述&#xff1a;给定 有限阿贝尓群 G中的2个元素a和b&#xff0c;找出最小的正整数x满足&#xff1a;b a ^^ x &#xff08;或者证明这样的x不存在&#xff09;。 二、阶数问题&#xff08;O…

自定义表单工作流的优势特点有啥?

低代码技术平台是提升办公效率的得力武器&#xff0c;在当今竞争激烈的社会中获得了很多中小企业的喜爱与支持。流辰信息是一家专业研发低代码技术平台的服务商&#xff0c;IBPS开发平台用于很多行业中&#xff0c;助力企业实现了办公流程化。自定义表单工作流的优势多、简单灵…

宝塔nginx配置SpringBoot服务集群代理

宝塔nginx配置SpringBoot服务集群代理 1、需求&#xff1a; 现有一个springboot服务需要部署成集群&#xff0c;通过nginx负载均衡进行访问&#xff0c;其中这个springboot服务内置了MQTT服务、HTTP服务、TCP服务。 MQTT服务开放了1889端口 HTTP服务开放了8891端口 HTTP服务开…

加固平板电脑在森林勘探上的应用|亿道三防onerugged

随着对森林资源的重视和需求的增长&#xff0c;森林勘探成为了一项重要的工作。在这个领域中&#xff0c;加固平板电脑的应用为森林勘探工作带来了显著的改善。 首先&#xff0c;三防平板电脑具备良好的耐用性和适应性&#xff0c;能够在恶劣的环境条件下稳定运行。在森林勘探…

LeetCode--代码详解 54.螺旋矩阵

54.螺旋矩阵 题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff…

STM32 UART详细解读(代码的编写)

文章目录 前言一、查询方式编写串口发送和接收的代码二、中断方式编写串口发送和接收的代码总结 前言 本篇文章来给大家讲解USART的代码详细讲解和使用步骤。 一、查询方式编写串口发送和接收的代码 串口查询发送函数&#xff1a; HAL_StatusTypeDef HAL_UART_Transmit(UART…

第2.4章 StarRocks表设计——分区分桶与副本数

目录 一、数据分布 1.1 概述 1.2 数据分布方式 1.2.1 Round-Robin 1.2.2 Range 1.2.3 List 1.2.4 Hash 1.3 StarRocks的数据分布方式 1.3.1 不分区 Hash分桶 1.3.2 Range分区Hash分桶 三、分区 3.1 分区概述 3.2 创建分区 3.2.1 手动创建分区 3.2.2 批量创建分区…

MIT-BEVFusion系列九--CUDA-BEVFusion部署2 create_core之参数设置

目录 加载命令行参数main 函数中的 create_core图像归一化参数体素化参数稀疏卷积网络参数真实世界几何空间参数 (雷达坐标系下体素网格的参数)解码后边界框的参数构建 bevfusion::Core 存储推理时需要的参数 本章开始&#xff0c;我们将一起看CUDA-BEVFusion的代码流程&#x…

Sample Pairing(ICLR 2018)

paper&#xff1a;Data Augmentation by Pairing Samples for Images Classification 本文的创新点 本文提出了一种新的应用于图像分类的数据增强方法SamplePairing&#xff0c;这种简单的数据增强技术显著提高了所有测试的数据集的分类精度。此外当训练集中的样本数量非常少…

vue3+element Plus+ts 自定义主题色,以及生成主题色各种透明度

目录 思路 安装css-color-function【接收一个颜色值&#xff0c;生成不同的透明度】 获取后台配置的主题色或者使用ColorPicker修改主题色 最终结果如下 思路 本篇文章的主体思路是从element Plus官网引申而来。结合了我以前用vue2element-ui配置主题色生成透明度&#x…

fastApi笔记01-路径参数

路径参数 使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量" from fastapi import FastAPIapp FastAPI()app.get("/items/{item_id}") def read_item(item_id):return {"item_id": item_id} http://127.0.0.1:8000/i…

年薪最高开到160万,鸿蒙开发人才紧缺!

华为鸿蒙开发人才紧缺 如今&#xff0c;鸿蒙与安卓彻底切割时间似乎越来越近&#xff0c;一批嗅觉灵敏的互联网厂商已经完成或开始启动开发鸿蒙原生App&#xff0c;包括美团、网易、今日头条、钉钉等。随着头部App厂商启动鸿蒙&#xff08;HarmonyOS&#xff09;原生应用开发&…

智慧公厕管理系统:让城市智慧驿站更加智慧舒适

智慧公厕管理系统是城市智慧驿站中不可或缺的一部分&#xff0c;它通过全方位的信息化解决方案&#xff0c;为公共厕所的使用、运营和管理提供了一种智能化的方式。作为城市智慧驿站的重要组成部分&#xff0c;智慧公厕管理系统发挥着重要的作用&#xff0c;为城市社会民生提供…