[Java] java 模拟售票,多线程的同步与互斥 →→→→→进入此内容的聊天室

来自 , 2019-07-08, 写在 Java, 查看 109 次.
URL http://www.code666.cn/view/1192265f
  1. /**
  2.  * 模拟售票,一个窗口售票,多个买票者购票,票数设为50 主要是利用线程间的同步于互斥
  3.  *
  4.  * 同步:线程2必须在线程1完成后才能进行
  5.  * 互斥:线程2和线程3访问同一变量,一次只能有一个线程访问
  6.  *
  7.  * @author
  8.  *
  9.  */
  10. public class SaleTicket {
  11.  
  12.         public static void main(String[] args) {
  13.                 Ticket t = new Ticket(50);
  14.                 setTicket set = new setTicket(t);// 售票线程
  15.                 set.start();
  16.                 // 买票线程
  17.                 for (int i = 1; i <= 52; i++) {
  18.                         getTicket get = new getTicket(t, "买票者  " + i + " ");
  19.                         get.start();
  20.                 }
  21.         }
  22. }
  23. //票对象
  24. class Ticket {
  25.         private int ticketNum;// 票数
  26.         boolean write = false;// 售票与买票间的同步信号量,同一时间只有一张票卖出
  27.         boolean read = true;// 买票者 买票间的信号量,一张票只能卖给一个人
  28.  
  29.         public Ticket(int ticketNum) {
  30.                 this.ticketNum = ticketNum;
  31.         }
  32.  
  33.         // 取票,票数减一
  34.         public synchronized void getTicket(String name) throws InterruptedException {
  35.                 // 售票员正忙,买票者进行等待
  36.                 while (!write && read) {
  37.                         System.out.println("*****************************" + name
  38.                                         + " 买票等待。。。");
  39.                         this.wait();
  40.                 }
  41.                 write = false;// 某个买票者要买票,售票员办理即进行等待
  42.                 if (ticketNum > 0) {
  43.                         read = false;// 让其他买票者等待
  44.                         System.out.println("*****************************" + name
  45.                                         + " 买票成功,号码=" + ticketNum);
  46.                         this.subTicketNum();// 销售一张票
  47.                         read = true;// 让其他买票者进行买票
  48.                         this.notifyAll();
  49.                 } else {// 票数为0
  50.                         read = false;
  51.                         System.out.println("*****************************票已经售完, " + name
  52.                                         + " 没有买到票");
  53.                 }
  54.         }
  55.  
  56.         // 售票
  57.         public synchronized void sellTicket(String name)
  58.                         throws InterruptedException {
  59.                 // 只要票数大于0,售票员就一直进行售票
  60.                 while (ticketNum > 0) {
  61.                         while (write) {
  62.                                 // 进行售票
  63.                                 System.out.println(name + " 处理业务,售票等待。。。");
  64.                                 this.wait();
  65.                         }
  66.                         if (ticketNum > 0) {
  67.                                 System.out.println(name + " 开始售票,号码=" + ticketNum);
  68.                         }
  69.                         write = true;
  70.                         this.notifyAll();
  71.                 }
  72.                 System.out.println(name + " 对不起,售票已经售完!");
  73.         }
  74.  
  75.         public void subTicketNum() {
  76.                 if (this.ticketNum > 0)
  77.                         this.ticketNum = this.ticketNum - 1;
  78.         }
  79.  
  80.         public int getTicketNum() {
  81.                 return ticketNum;
  82.         }
  83. }
  84.  
  85. // 购票者
  86. class getTicket extends Thread {
  87.         Ticket d;// 包含剩余票数
  88.         String name;// 购票者姓名
  89.  
  90.         public getTicket(Ticket d, String name) {
  91.                 this.d = d;
  92.                 this.name = name;
  93.         }
  94.  
  95.         public void run() {
  96.                 try {
  97.                         d.getTicket(name);
  98.                 } catch (InterruptedException e) {
  99.                         e.printStackTrace();
  100.                 }
  101.         }
  102. }
  103.  
  104. // 售票员
  105. class setTicket extends Thread {
  106.         Ticket d;
  107.  
  108.         public setTicket(Ticket d) {
  109.                 this.d = d;
  110.         }
  111.  
  112.         public void run() {
  113.                 try {
  114.                         d.sellTicket("售票员 1 ");
  115.                 } catch (InterruptedException e) {
  116.                         e.printStackTrace();
  117.                 }
  118.         }
  119. }
  120.  
  121. //java/5703

回复 "java 模拟售票,多线程的同步与互斥"

这儿你可以回复上面这条便签

captcha