a
- public class SellTicketDemo {
- /**
- *编写 三个类 ticket,sellWindow,ticketSellCenter,代表票信息,售票窗口,售票中心,
- *售票中心分配一定数量的票(多个窗口实现多线程售票)
- *
- *分析: 程序要实现的功能是卖票,跟卖票相关的操作有:设置票的总数setTicket(int num)、卖票sellTicket()、
- *记录票的余数的变量 Ticket;
- * 其中 ticketSellCenter 应该进行设置形式,即行使 setTiket的功能。售票窗 行使卖票功能。
- * 因为卖票是多线程进行,所以设置票,卖票的行为会出现同时访问 票Ticket的情况,即他们需要进行同步。
- * 考虑到函数同步需要使用同一个锁,所以把设置票的功能和卖票的功能放到同一个类中,方便实现同步。因此将他们
- * 直接放到ticket类中,由其他类来调用
- */
- public static void main(String[] args) {
- Ticket t = new Ticket();//票的对象,所有操作都是对该对象进行
- new TicketSellCenter(t).start();//启动设置线程,设置票的总数
- for(int i = 0;i<3;i++){
- new SellWindow(t).start();
- }
- }
- }
- class Ticket{
- private int ticket;
- public synchronized void setTicket(int num){//设置票的数量,需要同步
- this.ticket = num;
- System.out.println(Thread.currentThread().getName()+"设置票的总数为:"+num);
- }
- public synchronized void sellTicekt(){//卖票功能,需要同步
- try {
- Thread.sleep(50);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- if(ticket>0){
- System.out.println(Thread.currentThread().getName()+" 卖出一张票,剩余 "+(--ticket )+"张票");
- }
- }
- public int getTicket(){//对外提供票的余数
- return ticket;
- }
- }
- class SellWindow extends Thread{
- private Ticket t; //接收Ticket对象,保证卖票是对同一对象进行操作
- public SellWindow(Ticket t) {
- super();
- this.t = t;
- }
- @Override
- public void run() {//此线程的功能是卖票,所以在run里调用卖票的方法即可
- while(t.getTicket()>0){//余票大于0时,进行卖票
- t.sellTicekt();
- }
- }
- }
- class TicketSellCenter extends Thread{
- private Ticket t; //接收Ticket对象,保证卖票是对同一对象进行操作
- public TicketSellCenter(Ticket t) {
- super();
- this.t = t;
- }
- @Override
- public void run() {//功能是设置票,所以调用设置的函数运行就可以,而不需要将设置行为的具体代码放在里面
- t.setTicket(100);//设为100张票
- }
- }
复制代码
|
|