模拟售火车票 多线程

并发卖票系统:多线程模拟与计数

100张票,10个窗口(10个线程模拟),实现线程卖票计数



import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class SellTicket implements Runnable { private int count = 100; static Map<String,Integer> map = new ConcurrentHashMap<String,Integer>(); public static void main(String[] args) { SellTicket st = new SellTicket(); for (int i = 0; i < 10; i++) { Thread thread = new Thread(st); map.put(thread.getName(), 0); thread.start(); } } @Override public void run() { while (true) { synchronized(this){ if(count > 0){ count--; System.out.println("线程=" + Thread.currentThread().getName() + ";剩余票数=" + count); Iterator<Map.Entry<String,Integer>> i = map.entrySet().iterator(); while(i.hasNext()){ Map.Entry<String,Integer> entry=(Map.Entry<String,Integer>)i.next(); if(entry.getKey().equals(Thread.currentThread().getName())) map.put(entry.getKey(), entry.getValue().intValue() + 1); } }else if(count==0){ Iterator<Map.Entry<String,Integer>> i = map.entrySet().iterator(); while(i.hasNext()){ Map.Entry<String,Integer> entry=(Map.Entry<String,Integer>)i.next(); System.out.println("线程=" + entry.getKey() + ";卖票数=" + entry.getValue()); } } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }

  

 

 

 

 

转载于:https://www.cnblogs.com/evilrogue/archive/2013/01/11/2856531.html

### Java多线程实现火车票预订模拟系统 在Java中,可以通过多线程技术实现一个火车票预订模拟系统。该系统的核心在于多个票窗口同时访问共享资源(即剩余票数),因此需要确保线程安全,避免出现数据不一致的问题。以下是一个完整的实现方案[^1]。 #### 1. 线程安全的实现 为了保证多个线程同时操作共享资源时不发生冲突,可以使用`Synchronized`关键字或`ReentrantLock`来实现同步控制。下面的代码示例展示了如何通过`Synchronized`方法确保线程安全。 ```java class Ticket { private int tickets = 100; // 剩余票数 private Object lock = new Object(); // 锁对象 public void sellTicket(String windowName) { synchronized (lock) { // 同步块 if (tickets > 0) { try { Thread.sleep(100); // 模拟票耗时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "正在出第" + tickets + "票"); tickets--; // 出一票 System.out.println("目前还有" + tickets + "票"); } else { System.out.println("所有票已完!"); } } } } ``` #### 2. 创建票窗口 每个票窗口可以看作一个独立的线程,通过实现`Runnable`接口或继承`Thread`类来创建线程。以下是通过实现`Runnable`接口的方式创建票窗口的代码[^2]。 ```java class TicketSeller implements Runnable { private String windowName; private Ticket ticket; public TicketSeller(String windowName, Ticket ticket) { this.windowName = windowName; this.ticket = ticket; } @Override public void run() { while (true) { ticket.sellTicket(windowName); if (ticket.getTickets() <= 0) { break; // 如果票已罄,则停止票 } } } public int getTickets() { return ticket.tickets; } } ``` #### 3. 主程序启动 在主程序中,创建多个票窗口并启动它们。每个窗口会独立运行,同时尝试访问共享的票数资源。 ```java public class TicketBookingSystem { public static void main(String[] args) { Ticket ticket = new Ticket(); // 共享的票数资源 Thread w1 = new Thread(new TicketSeller("窗口1", ticket)); Thread w2 = new Thread(new TicketSeller("窗口2", ticket)); Thread w3 = new Thread(new TicketSeller("窗口3", ticket)); w1.start(); // 启动窗口1 w2.start(); // 启动窗口2 w3.start(); // 启动窗口3 } } ``` #### 4. 注意事项 - **线程安全**:由于多个线程同时访问共享资源(票数),必须采取同步措施以避免数据竞争。 - **性能优化**:可以通过调整`Thread.sleep()`的时间来模拟不同的票速度,或者使用更高效的锁机制(如`ReentrantLock`)来替代`Synchronized`。 - **异常处理**:在实际应用中,应考虑更多的异常场景,例如网络中断、用户取消订单等。 ### 示例输出 假设初始票数为100三个窗口同时票,可能的输出如下: ``` 窗口1正在出第100票 目前还有99票 窗口2正在出第99票 目前还有98票 窗口3正在出第98票 目前还有97票 ... 所有票已完! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值