多线程买票

  1. class SaleTicket implements Runnable{  
  2.     private int tickets = 100;  
  3.       
  4.       
  5.     private synchronized void sale(){  
  6.         if(tickets > 0){  
  7.             System.out.println(Thread.currentThread().getName() + "卖出 第 "+ (tickets--)+"张票");  
  8.               
  9.             try{  
  10.                 Thread.sleep(100);  
  11.             }catch(InterruptedException e){  
  12.                 e.printStackTrace();  
  13.             }  
  14.         }  
  15.     }  
  16.     public void run(){  
  17.         while(tickets > 0){  
  18.             sale();  
  19.         }  
  20.     }  
  21. }  
  22.   
  23.   
  24. public class JavaTest {  
  25.           
  26.     public static void main(String[] args){  
  27.   
  28.   
  29.         SaleTicket st = new SaleTicket();  
  30.         Thread t1 = new Thread(st, "一号窗口");  
  31.         Thread t2 = new Thread(st, "二号窗口");  
  32.         Thread t3 = new Thread(st, "三号窗口");  
  33.         Thread t4 = new Thread(st,"四号窗口 ");  
  34.         t1.start();  
  35.         t2.start();  
  36.         t3.start();  
  37.         t4.start();  
  38.           
  39.       
  40.           
  41.     }  
  42. }  
Java多线程买票案例是一个常见的教学示例,用于说明如何在多线程环境下解决资源同步问题。在这个案例中,通常会有一个票务系统,多个线程代表不同的买票者尝试购买有限数量的票。如果不正确处理多线程的同步问题,就可能出现同时卖出同一张票的错误情况,这被称为“超卖”。 为了实现这个案例,我们可以创建一个Ticket类来代表票务系统,它包含一个票数的成员变量和一个卖出票的方法。由于这个方法会被多个线程调用,我们需要确保在同一时间内只有一个线程能够执行这个方法,或者在方法执行过程中其他线程无法修改票数,以避免超卖。在Java中,我们通常使用synchronized关键字来实现同步访问。 以下是一个简化的代码示例: ```java public class Ticket { private int tickets = 100; // 假设有100张票 // 同步方法确保同一时间只有一个线程可以执行 public synchronized boolean buyTicket() { if (tickets > 0) { tickets--; // 减少一张票 System.out.println(Thread.currentThread().getName() + "买了一张票,剩余票数:" + tickets); return true; } else { return false; } } } public class Buyer extends Thread { private Ticket ticket; public Buyer(Ticket ticket) { this.ticket = ticket; } @Override public void run() { while (ticket.buyTicket()) { // 模拟买票的其他操作 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } // 创建票务对象和多个买票线程 public class TicketDemo { public static void main(String[] args) { Ticket ticket = new Ticket(); for (int i = 0; i < 5; i++) { new Buyer(ticket).start(); } } } ``` 在这个案例中,我们使用了同步方法buyTicket()来确保在卖票时的线程安全。每个buyer线程尝试购买票时,都会进入这个方法,并且在检查和减少票数的过程中,其他线程是无法进入这个方法的,这样就避免了超卖的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值