卖票问题升级版
这里我们实现使用电影院窗口和手机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并提供构造方法的。


浙公网安备 33010602011771号