生产者和消费者有关问题 ,为什么结果有些不对。麻烦高人帮忙看看

生产者和消费者问题 ,为什么结果有些不对。麻烦高人帮忙看看结果为什么不是放一个取一个?classTest{publics

生产者和消费者问题 ,为什么结果有些不对。麻烦高人帮忙看看
结果为什么不是   放一个   取一个   ?

class   Test
{
public   static   void   main(String[]   args)
{
Queue   q=new   Queue();
new   Thread(new   Producer(q)).start();
new   Thread(new   Consumer(q)).start();
}
}
class   Producer   implements   Runnable
{
Queue   q;
Producer(Queue   q)
{
this.q=q;
}
public   void   run()
{
for(int   i=0;i <10;i++)
{
q.put(i);
System.out.println( "Producer   put   "+i);
}
}
}

class   Consumer   implements   Runnable
{
Queue   q;
Consumer(Queue   q)
{
this.q=q;
}
public   void   run()
{
while(true)
{
System.out.println( "Consumer   get   "+   q.get());
}
}
}
class   Queue
{
boolean   isFull=false;
int   value;
public   synchronized   void   put(int   i)
{
if(isFull)
{
try
{
wait();
}
catch(Exception   e)
{
e.printStackTrace();
}
}
value=i;
isFull=true;
notify();
}
public   synchronized   int   get()
{
if(!isFull)
{
try
{
wait();
}
catch(Exception   e)
{
e.printStackTrace();
}
}
isFull=false;
notify();
return   value;
}
}


[解决办法]
多线程的意思 是模拟两个 CPU 同时运算,但具体分配给每个线程多少时间片,这是不得而知的,所以你启动两个线程,一个存数据,一个取数据, 将存取的方法设置为同步。 不表示就一定是先存后取,因为你的存的过程和取的过程 没有做协调控制, 只是在方法上作同步而已。
[解决办法]
你要把你实际的运行结果和你所期望的运行结果贴出来
要不怎么知道你到底在想什么呢?
[解决办法]
实际运行结果:
Producer put 0

Producer put 1

Consumer get 0

Producer put 2

Consumer get 1

Consumer get 2

Consumer get 3

Producer put 3

Consumer get 4

Producer put 4


期望运行结果:

Producer put 0

Consumer get 0

Producer put 1

Consumer get 1

Producer put 2

Consumer get 2

Producer put 3

Consumer get 3

Producer put 4

Consumer get 4

[解决办法]
楼主写的程序有问题,参考这个看看吧
package test;

class Order {
private static int i = 0;
private int count = i++;
public Order() {
if(count == 50) {
System.out.println( "没有食物了! ");
System.exit(0);
}
}
public String toString() { return "第 " + count + "份食物\n "; }
}
class WaitPerson extends Thread {
private Restaurant restaurant;
public WaitPerson(Restaurant r) {
restaurant = r;
start();
}
public void run() {
while(true) {
while(restaurant.order == null)
synchronized(this) {
try {
wait();
} catch(InterruptedException e) {
throw new RuntimeException(e);
}
}


System.out.println(
"有新食物来了,我吃掉 " + restaurant.order);
restaurant.order = null;
}
}
}
class Chef extends Thread {
private Restaurant restaurant;
private WaitPerson waitPerson;
public Chef(Restaurant r, WaitPerson w) {
restaurant = r;
waitPerson = w;
start();
}
public void run() {
while(true) {
if(restaurant.order == null) {
restaurant.order = new Order();
System.out.print( "厨师造出 "+ restaurant.order);
synchronized(waitPerson) {
waitPerson.notify();
}
}
try {
sleep(100);
} catch(InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Restaurant {

Order order;
public static void main(String[] args) {
Restaurant restaurant = new Restaurant();
WaitPerson waitPerson = new WaitPerson(restaurant);
Chef chef = new Chef(restaurant, waitPerson);

}
}
[解决办法]
协作没弄清楚
[解决办法]
up
[解决办法]
楼主,Queue是传引用的,这样搞肯定会出问题的。自已检查一下吧。
[解决办法]
太难了。。。我是 新手 看不懂。。。学习中~~
[解决办法]
mark!!