当前位置: 首页 > news >正文

使用ReentrantLock和ThreadPoolExecutor模拟抢课

这里主要是在场景下帮助理解ReentrantLock和线程池的使用。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class GrabCourseTask implements Runnable {private final String studentName;private static int availableSeats = 10; // 假设有10个名额private static final Lock lock = new ReentrantLock(); // 创建一个ReentrantLock实例public GrabCourseTask(String studentName) {this.studentName = studentName;}@Overridepublic void run() {try {if(grabCourse()) {System.out.println(studentName + " 抢到了一个名额!");} else {System.out.println(studentName + " 没有抢到名额。");}} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println(studentName + " 在尝试抢课时被中断。");}}private boolean grabCourse() throws InterruptedException {// 尝试获取锁if(lock.tryLock()) {try {if (availableSeats > 0) {availableSeats--; // 减少一个名额// 模拟服务器处理抢课请求需要一定的时间Thread.sleep(100);return true;}return false;} finally {lock.unlock(); // 确保在操作完成后释放锁}} else {// 如果无法立即获取锁,则表示当前有其他线程正在操作名额,直接返回失败return false;}}
}
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class CourseGrabbingSimulation {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(5, // 核心线程数10, // 最大线程数1, // 空闲线程存活时间TimeUnit.SECONDS, // 时间单位new ArrayBlockingQueue<>(5)); // 任务队列// 模拟多个学生抢课for (int i = 1; i <= 15; i++) {String studentName = "学生" + i;executor.execute(new GrabCourseTask(studentName));}// 关闭线程池executor.shutdown();}
}

在真实的抢课系统中,抢课的逻辑会更加复杂,需要考虑数据库的并发访问、事务处理、网络延迟等因素。
为了简化示例,这里使用了 ReentrantLock来控制对 availableSeats 的访问,保证了线程安全。在实际应用中,可能需要更复杂的并发控制机制。

http://www.lryc.cn/news/376049.html

相关文章:

  • VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具
  • 统计学一(术语,正态)
  • CleanMyMac X for Mac系统优化垃圾清理软件卸载 工具(小白轻松上手,简单易学)
  • 从0开始开发一个简单web界面的学习笔记(HTML类)
  • 【机器学习】对大规模的文本数据进行多标签的分类处理
  • C++之std::type_identity
  • 头歌资源库(10)拼数字
  • 虚谷数据库-定时作业
  • AWD攻防比赛流程手册
  • Golang的json解析--Gjson库的使用举例
  • 基于Langchain构建本地大型语言模型(LLM)问答系统的经验分享
  • 对抗式生成模仿学习(GAIL)
  • 信息系统项目管理师 | 新一代信息技术
  • 安全宣传咨询日活动向媒体投稿记住这个投稿好方法
  • 第7章:系统架构设计基础知识-软件架构风格
  • 自制调色小工具给图片加滤镜,修改图片红、绿、蓝通道及亮度,修改图片颜色
  • 【Redis】java客户端(SpringData和jedis)
  • 大数据安全经典面试题及回答(上)
  • vi/vim使用命令
  • webpack打包gz文件,nginx开启gzip压缩
  • 微服务开发与实战Day11 - 微服务面试篇
  • 基于Spring Boot+VUE职称评审管理系统
  • MySQL 基本语法讲解及示例(上)
  • 6.18作业
  • Excel文件转换为HTML文件
  • MySQL数据库入门
  • vue element-ui 下拉框 以及 input 限制输入,小数点后保留两位 界面设计案例 和 例子:支持mp4和m3u8视频播放
  • Python基础用法 之 运算符
  • 事务所管理系统的设计
  • airsim安装