今天写的还是关于线程的代码,模拟乘客排队买票的情形。看了书上的两个人买票的例子,我写了课后题中三个人买票的情况。
题目是:售货员只有三张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和代码中设置的不同。