/*
 * 创建日期 2006-9-8
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
package sendproc;/**
 * @author Administrator
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
class Stack
{
 int count;
String[] data=new String[20];
public   synchronized void push(String str)

while(count==data.length)
{
try
{
this.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
this.notify();
data[count]=str;
count++;
}
public  synchronized String get()
{
while(count==0)
{
try
{
this.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
this.notify();
count=count-1;
return data[count];

}
}
class Producer implements Runnable
{
Stack Stackone;
public Producer(Stack s)
{
Stackone=s;
}
public void run()
{
String str;
for(int i=0;i<20;i++)
{
str=String.valueOf(i+1);
Stackone.push(str);
System.out.println("Product:"+str+" count="+Stackone.count);
try
{
Thread.sleep((int)(Math.random()*100));
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
class Coumter implements Runnable
{
Stack stackOne;
    public Coumter(Stack s)
    {
     stackOne=s;
    }
    public void run()
    {
     String s;
     for(int i=0;i<20;i++)
     {
     s=stackOne.get();
     System.out.println("Coumet:"+s+" count="+stackOne.count);
     try
{
Thread.sleep((int)(Math.random()*100));
}
catch(InterruptedException e)
{
e.printStackTrace();
}
     }
    }
}
public class StackTest { public static void main(String[] args) {
Stack s=new Stack();
Producer p=new Producer(s);
Coumter c=new Coumter(s);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}此为生产者和消费者模型,操作栈
但是执行结果却如下:Product:1 count=1
Coumet:1 count=0
Coumet:2 count=0
Product:2 count=0
Coumet:3 count=0
Product:3 count=0
Product:4 count=1
Coumet:4 count=0
Product:5 count=1
Coumet:5 count=0
Product:6 count=1
Coumet:6 count=0
Coumet:7 count=0
Product:7 count=0
Product:8 count=1
Coumet:8 count=0
Coumet:9 count=0
Product:9 count=0
Coumet:10 count=0
Product:10 count=0
Coumet:11 count=0
Product:11 count=0
Coumet:12 count=0
Product:12 count=0
Coumet:13 count=0
Product:13 count=0
Product:14 count=1
Product:15 count=2
Coumet:15 count=1
Product:16 count=2
Product:17 count=3
Coumet:17 count=2
Product:18 count=3
Product:19 count=4
Coumet:19 count=3
Product:20 count=4
Coumet:20 count=3
Coumet:18 count=2
Coumet:16 count=1
Coumet:14 count=0我实在弄不懂 为什么会出现Product:1 count=1
Coumet:1 count=0
Coumet:2 count=0
这种情况呢?
生产者还没生产出来  消费者就消费掉了,请各位高手给小弟指点一二。

解决方案 »

  1.   

    /*
     * Copyright (c) 2005-2006, AnQ Systems, Ltd.
     * 
     * $Id: Exp $
     *
     * $Source$
     * 
     */
    package sendproc;class Stack {
        int count;    String[] data = new String[20];    public synchronized void push(String str) {
            while (count == data.length) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Product:" + str + " count=" + count);
            this.notify();
            data[count] = str;
            count++;
        }    public synchronized String get() {
            while (count == 0) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            count --;
            System.out.println("Coumet:" + data[count] + " count=" + count);
            this.notify();
            return data[count];    }
    }class Producer implements Runnable {
        Stack Stackone;    public Producer(Stack s) {
            Stackone = s;
        }    public void run() {
            String str;
            for (int i = 0; i < 20; i++) {
                str = String.valueOf(i + 1);
                Stackone.push(str);
                //System.out.println("Product:" + str + " count=" + Stackone.count);
                try {
                    Thread.sleep((int) (Math.random() * 100));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }class Coumter implements Runnable {
        Stack stackOne;    public Coumter(Stack s) {
            stackOne = s;
        }    public void run() {
            String s;
            for (int i = 0; i < 20; i++) {
                s = stackOne.get();
               // System.out.println("Coumet:" + s + " count=" + stackOne.count);
                try {
                    Thread.sleep((int) (Math.random() * 100));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }public class StackTest {    public static void main(String[] args) throws InterruptedException {
            Stack s = new Stack();
            Producer p = new Producer(s);
            Coumter c = new Coumter(s);
            Thread t1 = new Thread(p);
            Thread t2 = new Thread(c);
            t1.start();
            //Thread.sleep(5000);
            t2.start();
        }
    }
      

  2.   

    PC 程序写的没有什么问题。 你看到到现象,是因为System.out.println 没有同步  。 
      

  3.   

    同意楼上的
    System.out.println()没有同步
    建议在每个print中都加入timestamp
    system.getmillsecond()取得微秒时间
      

  4.   


    Stackone.push(str);和System.out.println("Product:"+str+" count="+Stackone.count);
    中间是可以被消费者线程中断的,估计是生产者产生了两个元素,但在第二个元素被打印出来前消费者线程运行了两次,所以看到的是你说的结果。不知对否
      

  5.   

    在STACK中设个flag看是否有放数据,在每次push get时都判断一下