【Java】学习路径49-练习:使用两个不同的线程类实现买票系统

练习:使用两个不同的线程类实现买票系统

请创建两个不同的线程类、一个测试类以及一个票的管理类。

其中票的管理类用于储存票的数量。两个线程类看作不同的买票方式。


步骤:

1、创建所需的类

App售票线程类

public class Runnable_AppTicketSeller implements Runnable{     @Override     public void run() {     } }

Web售票线程类

public class Runnable_WebTicketSeller implements Runnable{     @Override     public void run() {     } }

买票测试类

public class BuyTicket {     public static void main(String[] args) {         Runnable_AppTicketSeller ra = new Runnable_AppTicketSeller();         Runnable_WebTicketSeller rb = new Runnable_WebTicketSeller();         Thread tApp = new Thread(ra,App售票);         Thread tWeb = new Thread(rb,Web售票);         tApp.start();         tWeb.start();     } }

 票务管理类

public class TicketMgr {     public static int count = 100; }

 

2、编写两个售票类

 在两个run()中加入:

while (true){     if(TicketMgr.count>0){         System.out.println(Thread.currentThread().getName()+卖出第+TicketMgr.count+张票);         TicketMgr.count--;     }else break; }

我们需要在这添加线程锁。

但是我们现在是两个不同的线程类,按照以前的方法是不行的。

我们可以在售票处构造一个lock,然后传进两个线程类中。

那么我们要为两个线程类添加一个构造方法,传入同一个lock锁。

售票类:

public class BuyTicket {     public static void main(String[] args) {         Object lock = new Object();         Runnable_AppTicketSeller ra = new Runnable_AppTicketSeller(lock);         Runnable_WebTicketSeller rb = new Runnable_WebTicketSeller(lock);         Thread tApp = new Thread(ra,App售票);         Thread tWeb = new Thread(rb,Web售票);         tApp.start();         tWeb.start();     } }

两个线程类:

public class Runnable_AppTicketSeller implements Runnable{     Object lock;     public Runnable_AppTicketSeller(Object lo){         lock = lo;     }     @Override     public void run() {         while (true){             synchronized (lock) {                 if (TicketMgr.count > 0) {                     System.out.println(Thread.currentThread().getName() + 卖出第 + TicketMgr.count + 张票);                     TicketMgr.count--;                 } else break;             }         }     } }
public class Runnable_WebTicketSeller implements Runnable{     Object lock;     public Runnable_WebTicketSeller(Object lo){         lock = lo;     }     @Override     public void run() {         while (true){             synchronized (lock) {                 if (TicketMgr.count > 0) {                     System.out.println(Thread.currentThread().getName() + 卖出第 + TicketMgr.count + 张票);                     TicketMgr.count--;                 } else break;             }         }     } }

3、简化代码

public class BuyTicket {     public static void main(String[] args) {         Object lock = new Object();         Runnable_AppTicketSeller ra = new Runnable_AppTicketSeller(lock);         Runnable_WebTicketSeller rb = new Runnable_WebTicketSeller(lock);         new Thread(ra,App售票).start();         new Thread(rb,Web售票).start();     } }

 

完成✅