售票的代码,参考下吧。
- public class Test7 {
- public static void main(String[] args) {
-
- Ticket tk = new Ticket();//建立票信息对象
- TicketSealCenter tsc = new TicketSealCenter(tk);// 创建售票中心。
- tsc.set(200);//售票中心分配一定数量的票
-
- new Thread(new SealWindow(tk,"一号窗口")).start();// 创建、启动线程,开始卖票。
- new Thread(new SealWindow(tk,"二号窗口")).start();
- new Thread(new SealWindow(tk,"三号窗口")).start();
- new Thread(new SealWindow(tk,"四号窗口")).start();
-
-
-
-
- }
- }
- class Ticket//票信息类
- {
- private int ticket;//票数
- public int getTicket()//获取票数
- {
- return ticket;
- }
- public void setTicket(int ticket)//设置票数。
- {
- this.ticket = ticket;
- }
-
- }
- class TicketSealCenter// 售票中心类
- {
- private Ticket tk;
- public TicketSealCenter(Ticket tk)//一初始化就有票信息。
- {
- this.tk = tk;
- }
-
- public void set(int t)//分配一定数量的票
- {
- tk.setTicket(t);
-
- }
-
- }
- class SealWindow implements Runnable // 售票窗口类
- {
-
- private Ticket tk;
- private String name;
- public SealWindow(Ticket tk,String name)// 一初始化就有票信息和窗口名字。
- {
- this.tk = tk;
- this.name = name;
- }
-
-
- public void run()// 里面是多线程执行的卖票代码。
- {
-
- while(true)//循环卖票
- {
- synchronized(tk)//同步代码块,保证多线程的安全性。
- {
- int t = tk.getTicket();//获取票数
- if(t>0)//判断是否还有票。
- {
- System.out.println(name+": 第"+(t--)+"张票已卖出");
- tk.setTicket(t);// 设置余票信息。
- }
- else
- {
- System.out.println(name+": 票已售完");//票数为0.
- break;// 退出循环。
-
- }
- }
-
- }
-
-
- }
- }
复制代码 |