老师留的作业,模拟生产者消费者问题,写个印票-售票-买票的程序。代码如下:
问题在代码后!
//测试类
public class Ticket{
public static void main(String[]args){
TicketSeller s=new TicketSeller(10);
Producer p=new Producer("印票人员",s);
Traveler t=new Traveler("旅客",s);
p.start();
t.start();
}
}
//旅客
class Traveler extends Thread{
private String name;
private TicketSeller s;
public Traveler(String n,TicketSeller s){
name=n;
this.s=s;
}
public void run(){
while(true){
s.delTicket(name);
try{
Thread.sleep((int)Math.random()*1);
}catch(Exception e){}

}
}
}
//印票
class Producer extends Thread{
private String name;
private TicketSeller s;
public Producer(String n,TicketSeller s){
name=n;
this.s=s;
}
public void run(){
while(true){
s.addTicket(name);
try{
Thread.sleep((int)Math.random()*1);
}catch(Exception e){}
}
}
}
//卖票
class TicketSeller{
private int count;
private int size;
public TicketSeller(int i){
size=i;
}
public synchronized void addTicket(String n){
while(count==size){
try{
this.wait();
System.out.println("印票线程等待!~~~~~~~~~~~~~~~");
}catch(Exception e){}
}
this.notify();
count++;
System.out.println(n+" 开始印票  剩余票数为 "+count);
}
public synchronized void delTicket(String n){
while(count==0){
try{
this.wait();
System.out.println("旅客买票线程等待!~~~~~~~~~~~~~");
}catch(Exception e){}
}
this.notify();
count--;
System.out.println(n+" 买票  剩余票数为 "+count);
}
}结果可能出现如下情况:
1.
印票人员 开始印票  剩余票数为 10
旅客 买票  剩余票数为 9
印票人员 开始印票  剩余票数为 10
旅客 买票  剩余票数为 9
印票线程等待!~~~~~~~~~~~~~~~
印票人员 开始印票  剩余票数为 10
旅客 买票  剩余票数为 9
印票线程等待!~~~~~~~~~~~~~~~
2.
印票人员 开始印票  剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
旅客 买票  剩余票数为 0
印票人员 开始印票  剩余票数为 1
旅客 买票  剩余票数为 0
印票人员 开始印票  剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
旅客 买票  剩余票数为 0
印票人员 开始印票  剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
请问如何解决上述2种情况

解决方案 »

  1.   

    还有老师让实现下载功能,但是我刚接触API,不知道使用哪个包,达人偷偷告诉下!
      

  2.   

    以后写代码一定要写在代码栏里,不然别人看得费力.我为你重写了一下,你比较看一下.public class Ticket {
    public static void main(String[] args) {
    TicketSeller s = new TicketSeller(10);
    Producer p = new Producer("印票人员", s);
    Traveler t = new Traveler("旅客", s);
    p.start();
    t.start();
    }
    }// 旅客
    class Traveler extends Thread {
    private String name; private TicketSeller s; public Traveler(String n, TicketSeller s) {
    name = n;
    this.s = s;
    } public void run() {
    while (true) {
    s.delTicket(name);
    try {
    Thread.sleep((int) (Math.random() * 1000));
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }// 印票
    class Producer extends Thread {
    private String name; private TicketSeller s; public Producer(String n, TicketSeller s) {
    name = n;
    this.s = s;
    } public void run() {
    while (true) {
    s.addTicket(name);
    try {
    Thread.sleep((int) (Math.random() * 1000));
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }// 卖票
    class TicketSeller {
    private int count; private int size; public TicketSeller(int i) {
    size = i;
    } public synchronized void addTicket(String n) {
    if (count >= size) {
    try {
    System.out.println("印票线程等待!~~~~~~~~~~~~~~~");
    Thread.sleep((int) (Math.random() * 1000));
    } catch (Exception e) {
    e.printStackTrace();
    }
    } else {
    count++;
    System.out.println(n + " 开始印票  剩余票数为 " + count);
    }
    } public synchronized void delTicket(String n) {
    if (count <= 0) {
    try {
    System.out.println("旅客买票线程等待!~~~~~~~~~~~~~");
    Thread.sleep((int) (Math.random() * 1000));
    } catch (Exception e) {
    e.printStackTrace();
    }
    } else {
    count--;
    System.out.println(n + " 买票  剩余票数为 " + count);
    }
    }
    }
      

  3.   

    正在学习wait()和notify()所以就用了他俩试试
    123
      

  4.   

    哦,不好意思,把你初衷都改了.其实也一样,只要加上就行了.class TicketSeller {
    private int count; private int size; public TicketSeller(int i) {
    size = i;
    } public synchronized void addTicket(String n) {
    if (count >= size) {
    try {
    System.out.println("印票线程等待!~~~~~~~~~~~~~~~");
    this.wait();
    } catch (Exception e) {
    e.printStackTrace();
    }
    } else {
    this.notify();
    count++;
    System.out.println(n + " 开始印票  剩余票数为 " + count);
    }
    } public synchronized void delTicket(String n) {
    if (count <= 0) {
    try {
    System.out.println("旅客买票线程等待!~~~~~~~~~~~~~");
    this.wait();
    } catch (Exception e) {
    e.printStackTrace();
    }
    } else {
    this.notify();
    count--;
    System.out.println(n + " 买票  剩余票数为 " + count);
    }
    }
    }
      

  5.   

    API上说的,看的不是很明白,貌似是说要用while的对于某一个参数的版本,实现中断和虚假唤醒是可能的,而且此方法应始终在循环中使用:synchronized (obj) {
    while (<condition does not hold>)
    obj.wait();
    ... // Perform action appropriate to condition
         }
     
      

  6.   

    仔细理解一下,它本身就在循环中.
    是在生产者Producer 和消费者Traveler 的循环中.你的程序多用了循环.