/*
 编写程序.生产者每隔100ms生产一个0~9之间的一个数,保存在一个MyNumber类型的对象中,并显示出来.
 只要这个MyNumber对象中保存了新的数字(意思就是只要与之前保存的那个数不相同就打印出来,
 相同的就继续随机生成直到不相同时就输出),消费者就将其取出来并显示.
 */
 
class Producer implements Runnable
{
MyNumber number;
int num;

Producer(MyNumber my)
{
number=my;
}

public void run()
{
for(int i=0;i<10;i++)
{
  num=(int)(Math.random()*9);
  number.push(num);
 
  try
  {
  Thread.sleep(100);
  }
  catch(InterruptedException e){}
  }
 }
}
 
class Consumer implements Runnable
{
MyNumber number;
int num;

Consumer(MyNumber my)
{
number=my;
}

public void run()
{
for(int i=0;i<10;i++)
{
num=number.get();
System.out.println(num);

try
{
Thread.sleep(100);
}
catch(Exception e){}
}
}
}class MyNumber 
{
int num;
int i=100;
public synchronized void push(int i)
{
num=i;
notify();
}

public synchronized int get()
{
while(num==i)
{
try
{
wait();
}
catch(InterruptedException e){}
}
i=num;
return num;
}
}public class Ex9
{
public static void main(String[] args)
{
MyNumber number=new MyNumber();

Producer p=new Producer(number);
Consumer c=new Consumer(number);

Thread t1=new Thread(p);
Thread t2=new Thread(c);

t1.start();
t2.start();
}
}
以上代码我只是循环10次..每次循环都生成一个随机数(0~9)的..
问题就出在我输出随机数那个线程那里,因为如果生成一个数字跟上一个生成的一样的话就不输出(这里会 wait() 一下),重新回去生成一个,所以如果在第10次循环的是跟上一个一样的话,就 wait() 了..而生成随机数那个线程又循环完了..那么就一直 wait() 下去..有没有解决方法.? 或希望有高手可以重写一下代码.   :)ps:表达能力不好,希望大家能将就点吧...

解决方案 »

  1.   

    UnAgain..你上次帮我写的那个写错了.~
     题目的意思我上次没说好..不好意思..
      

  2.   

    只修改下面这部分就行。import java.util.Vector;class Producer implements Runnable {
    MyNumber number;
    int num;

    // 增加一个Vector
    Vector<Integer> nums = 
    new Vector<Integer>();

    Producer(MyNumber my) {
    number=my;

    // 赋值
    for (int i=0; i<10; i++) {
    nums.add(i);
    }
    }

    public void run() {
    for(int i=0;i<10;i++) { // 注意nums.size()
    int pos = (int)(Math.random() * nums.size());

      num = nums.get(pos);
     
      // 去掉已赋的值
      nums.remove(pos);
     
    number.push(num); try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    }
    }
    }
    }
      

  3.   

    class Producer implements Runnable
    {
    MyNumber number;
    int num;

    Producer(MyNumber number){
    this.number = number;
    }

    public void run(){

    for(int i=0;i<10;i++){
      num=(int)(Math.random()*10);
      number.push(num);
     
      try{
      Thread.sleep(500);
      }catch(InterruptedException e){}
      }
     }
    }
     
    class Consumer implements Runnable{
    MyNumber number;
    int num;

    Consumer(MyNumber number){

    this.number=number;
    }

    public void run(){

    for(int i=0;i<10;i++){

    num=number.get();
    System.out.println(num);
    }
    }
    }class MyNumber {

    int num;
    boolean empty=true; public synchronized void push(int num){

    if(empty==false)
    try{
    wait();
    }catch(Exception e){}
    this.num=num;
    empty = false;
    notify();
    }

    public synchronized int get(){

    if(empty==true)
    try{
    wait();
    }catch(InterruptedException e){}
    empty = true;
    notify();
    return num;
    }
    }public class Ex9{

    public static void main(String[] args){

    MyNumber number=new MyNumber();

    Producer p=new Producer(number);
    Consumer c=new Consumer(number);

    Thread t1=new Thread(p);
    Thread t2=new Thread(c);

    t1.start();
    t2.start();
    }
    }