Practice Every Day_3

来源:互联网 发布:淘宝卖家怎么开通客服 编辑:程序博客网 时间:2024/06/05 00:11

            今天写的还是关于线程的代码,模拟乘客排队买票的情形。看了书上的两个人买票的例子,我写了课后题中三个人买票的情况。

题目是:售货员只有三张5元的钱,每张票卖5元。张先生拿20元买票并且排在最前面,李先生拿10元买票,排在第二,赵先生拿5元买票,排在最后面。

以下为代码:       

import java.awt.*;
import java.awt.event.*;
public class TicketOnSale { 
 public static void main(String[] args)
 {
  new SaleTicket("模拟售货员买票"); 
 }
}
class SaleTicket extends Frame implements Runnable,ActionListener
{
  Button b=new Button("开始卖票");
    static TextArea text=new TextArea();
    Thread zhang=new Thread(this);
    Thread li=new Thread(this);
    Thread zhao=new Thread(this);
    SalesClerk clerk=new SalesClerk();
    SaleTicket(String s)
    {
     add(text,BorderLayout.CENTER);
     add(b,BorderLayout.NORTH);
     b.setSize(5,10);
     b.addActionListener(this);
     setBounds(100,100,300,300);
     setVisible(true);
     b.setBackground(Color.pink);
     text.setBackground(Color.white);
     addWindowListener(new WindowAdapter()
     {
      public void windowClosing(WindowEvent e)  
      { 
       System.exit(0);
      }       
     });
    }
   public void actionPerformed(ActionEvent e)
   {
 try
      {
  zhang.start();
     li.start();
     zhao.start();
   }
 catch(Exception exp){}
   }
   public void run()
   {
  if(Thread.currentThread()==zhang) 
  {
  clerk.rule(20);
  text.append("\n"+"于是王买到票了。");
  }
  else if(Thread.currentThread()==li)
  {
  clerk.rule(10);
  text.append("\n"+"于是李买到票了。");
  }
  else if(Thread.currentThread()==zhao) 
  {
   clerk.rule(5);
  text.append("\n"+"于是赵买到票了。");
  }
   
   }  
}
class SalesClerk
{
  int fivecount=3,tencount=0,twentycount=0; 
  String s=null;
  public synchronized void rule(int money)
 {
  if(money==5)
  {
   fivecount+=fivecount;
   s="您给的钱正好,给您入场券。";
   SaleTicket.text.append("\n"+s);
  }
  else if(money==10)
   {
    while(fivecount<1)
    {
     try{wait();}   
        catch(InterruptedException e){}
    }
    fivecount-=1;
    tencount+=1;
    s="您给我10元,找给您5元,给您入场券。";
    SaleTicket.text.append("\n"+s);
   }

  else if(money==20)
   {
    while(tencount<1||fivecount<1)
    {
     try{wait();}
        catch(InterruptedException e){}
    }
       tencount-=1;
    fivecount-=1;
    twentycount+=1;
    s="您给我20,找给您15,给您入场券。";
    SaleTicket.text.append("\n"+s);
   
   }
   notifyAll();
 }
}

注意append(String s)与setText(String s)的不同:

append(String s)是将给定文本追加到文本区的当前文本,setText(String s)是将此文本组件显示的文本设置为指定文本。

效果图如下:

由于窗口是可变动的,所以看上去的size和代码中设置的不同。
原创粉丝点击