您的位置:首页 > 汽车 > 新车 > 使用ReentrantLock和ThreadPoolExecutor模拟抢课

使用ReentrantLock和ThreadPoolExecutor模拟抢课

2024/11/19 1:19:10 来源:https://blog.csdn.net/qq_43954910/article/details/139785465  浏览:    关键词:使用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 的访问,保证了线程安全。在实际应用中,可能需要更复杂的并发控制机制。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com