卖票问题升级版

这里我们实现使用电影院窗口和手机APP同时卖票:

因为是两种方式同时卖票,所以我们需要创建两个类,一个是AppTicket类,一个是WindowTicket类。另外还需要创建一个类专门来管理票,因为两个线程是需要共享“票”这个数据的。最后创建一个类,里面是主方法。

AppTicket:

 1 package com.hw.third0225;
 2 
 3 public class WindowTicket implements Runnable{
 4     
 5     private Object lock;
 6     public WindowTicket(Object lock){
 7         this.lock = lock;
 8     }
 9 
10     @Override
11     public void run() {
12         while(TicketMng.ticket < 201)
13         {
14             synchronized (lock) {
15                 if(TicketMng.ticket < 201){
16                     System.out.println(Thread.currentThread().getName()
17                             +"窗口售卖了第"+TicketMng.ticket+"张票");
18                     TicketMng.ticket++;
19                 }
20             }
21             
22             try {
23                 Thread.sleep(10);
24             } catch (InterruptedException e) {
25                 // TODO Auto-generated catch block
26                 e.printStackTrace();
27             }
28         }
29     }
30 }

WindowTicket:

 1 package com.hw.third0225;
 2 
 3 public class AppTicket implements Runnable{
 4     
 5     private Object lock;
 6     public AppTicket(Object lock){
 7         this.lock = lock;
 8     }
 9     
10     @Override
11     public void run() {
12         while(TicketMng.ticket < 201)
13         {
14             synchronized (lock) {
15                 if(TicketMng.ticket < 201){
16                     System.out.println(Thread.currentThread().getName()
17                             +"手机app售卖了第"+TicketMng.ticket+"张票");
18                     TicketMng.ticket++;
19                 }
20             }
21             
22             try {
23                 Thread.sleep(5);
24             } catch (InterruptedException e) {
25                 // TODO Auto-generated catch block
26                 e.printStackTrace();
27             }
28         }
29     }
30 }

 TicketMng:

1 package com.hw.third0225;
2 
3 public class TicketMng {
4     public static int ticket = 1;
5 }

SellingTickets:

 1 package com.hw.third0225;
 2 
 3 public class SellingTickets {
 4     public static void main(String[] args) {
 5         
 6         Object lock = new Object();
 7         
 8         AppTicket appticket = new AppTicket(lock);
 9         WindowTicket windowticket = new WindowTicket(lock);
10         
11         new Thread(appticket,"手机app").start();
12         new Thread(windowticket,"窗口").start();
13     }
14 }

这里面我们知道,lock这个对象new我们是在主方法里面new出来的,否则,new出来的就是两个lock,达不到两个线程共享一个数据的作用。但是在各自的类里面还是需要声明一个lock并提供构造方法的。

 

 

posted @ 2021-02-25 21:08  EvanTheBoy  阅读(67)  评论(0)    收藏  举报