1.以下程序为售票线程类。定义测试类,在主方法中用三个线程模拟三个售票窗口,总共出售200张票。运行程序,分析输出结果。
class SellTickets implements Runnable{
private int tickets = 200;
public void run() {
while(tickets > 0)
{
System.out.println( Thread.currentThread().getName() +
" is selling ticket "+tickets--);
}
}
}
2.定义测试类,在主方法中创建两个线程模拟出票和售票过程。运行程序,查看输出结果。去掉Tickets类中的注释语句,重新运行程序,分析有何问题,原因是什么?改正程序,重新运行程序,记录输出结果。
class Tickets {
int number = 0; //存票票号
int size; //总票数
boolean available = false; //表示目前是否有票可售
int i = 0; //售票序号
public Tickets(int size) //构造函数,传入总票数参数
{
this.size=size;
}
public void put(){
System.out.println("Producer puts ticket "+(++number));
available=true;
}
public void sell(){
if(available==true && i<=number)
System.out.println("Consumer buys ticket "+(++i));
if(i==number) {
/*try{ Thread.sleep(1); } catch ( InterruptedException exception ) {};*/
available=false;
}
}
}
class Producer1 extends Thread //存票线程
{
Tickets t=null;
public Producer1(Tickets t)
{ this.t=t; }
public void run()
{
while( t.number < t.size)
{
t.put();
}
}
}
class Consumer1 extends Thread //售票线程
{
Tickets t=null;
public Consumer1(Tickets t)
{ this.t=t; }
public void run()
{
while(t.i < t.size)
{
t.sell() ;
}
}
}
3.修改以上程序,实现每存入一张票,就售出一张票,售出后再存入。