题目:
 编写程序.生产者每隔100ms生产一个0~9之间的一个数,保存在一个MyNumber类型的对象中,并显示出来.
 只要这个MyNumber对象中保存了新的数字,消费者就将其取出来并显示. 
class Producer implements Runnable
{
MyNumber number=new MyNumber();
int num;

Producer(MyNumber my)
{
number=my;
}

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

Consumer(MyNumber my)
{
number=my;
}

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

try
{
Thread.sleep(100);
}
catch(Exception e){}
}
}
}class MyNumber 
{
int num;
int i=10;

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个数之前会停止打印了..不知道为什么..光标就一直在闪.又没有出现那句"Press any key..."那话.,请大家指点下..
最好希望有朋友可以写出正确的代码..谢谢..

解决方案 »

  1.   

    for(int i = 1; i < 11; i++)
    它本来就是循环10次
      

  2.   

    看不懂你想干什么。
    你又没写相应的代码,怎么会出现“Press any key”呢?
      

  3.   

    class Producer implements Runnable {
        //因为在Construct中把另外的引用给给number,所以此处不需初始化。
        //MyNumber number = new MyNumber();
        MyNumber number;
        
        // 局部变量即可
        //int num;    Producer(MyNumber my) {
            number = my;
        }    public void run() {        // 习惯上,计数从0开始
            //for (int i = 1; i < 11; i++) {
            for (int i = 0; i<Ex9.count; i++) {
                int num = (int) (Math.random() * 9);
                number.push(num);            try {                
                    //100太长,超过我能忍耐的程度
                    //Thread.sleep(100);
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                }
            }
        }
    }class Consumer implements Runnable {
        //MyNumber number = new MyNumber();
        MyNumber number;    //int num;    Consumer(MyNumber my) {
            number = my;
        }    public void run() {
            //for (int i = 1; i < 11; i++) {
            for (int i = 0; i<Ex9.count; i++) {
                int num = number.get();
                System.out.println(num);            try {
                    Thread.sleep(50);
                } catch (Exception e) {
                }
            }
        }
    }class MyNumber {
        int num;
        boolean isRaw;    int i = 10;    public synchronized void push(int i) {
            // 如果上次产生的数没有被读出,等待
            while (isRaw) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }        isRaw = true;
            num = i;
            notify();
        }    public synchronized int get() {
            
            // 你的数字是由Producer随机产生的,两次生成相同数值的情况是存在的
            // 所以不能使用这中方法判断是否有新值。
            //while(num==i) {
            while (!isRaw) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }        //i = num;
            isRaw = false;
            return num;
        }
    }public class Ex9 {
        // 统一循环次数
        static int count = 10;    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();
        }
    }
      

  4.   

    原來這樣阿..   謝謝 UnAgain ...