java 双线程的一个简单的例题 有些地方不是很明白啊。。
程序代码:
class Producer extends Thread
{
Queue q;
Producer(Queue q)
{
this.q=q;
}
public void run()
{
for(int i=1;i<5;i++)
{
q.put(i);
}
}
}
class Consumer extends Thread
{
Queue q;
Consumer(Queue q)
{
this.q=q;
}
public void run()
{
while(true)
{
q.get();
}
}
}
class Queue
{
int value=0;
boolean isEmpty=true;
public synchronized void put(int v)
{
if(!isEmpty)
{
try
{
System.out.println("生产者等待");
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
else
value+=v;
isEmpty=false;
System.out.println("生产者共生产数量"+v);
notify();
}
public synchronized int get()
{
if(isEmpty)
{
try{
System.out.println("消费者等待");
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
value--;
if(value<1)
{
isEmpty=true;
}
System.out.println("消费者消费一个,剩余"+value);
notify();
return value;
}
}
public class ThreadCommunication {
public static void main(String[] args) {
Queue q=new Queue();
Producer p=new Producer(q);
Consumer c=new Consumer(q);
c.start();
p.start();
}
}
为什么我代码没变 运行后 出来的结果会有两种呢???
大多数是
消费者等待
生产者共生产数量1
生产者等待
消费者消费一个,剩余0
消费者等待
生产者共生产数量2
生产者等待
消费者消费一个,剩余-1
消费者等待
生产者共生产数量3
生产者等待
消费者消费一个,剩余-2
消费者等待
生产者共生产数量4
消费者消费一个,剩余-3
消费者等待
为什么会显示出这样的代码呢。 还有-3 我没写负号阿 。生产数量4个消费一个么理所当然是3阿
偶尔几次显示如下,这才是我想要实现的内容
消费者等待
生产者共生产数量1
生产者等待
消费者消费一个,剩余0
生产者共生产数量2
生产者等待
消费者消费一个,剩余1
消费者消费一个,剩余0
生产者共生产数量3
生产者等待
消费者消费一个,剩余2
消费者消费一个,剩余1
消费者消费一个,剩余0
生产者共生产数量4
消费者消费一个,剩余3
消费者消费一个,剩余2
消费者消费一个,剩余1
消费者消费一个,剩余0
消费者等待
怎么会这样呢??
还有代码最后一段
Queue q=new Queue();
Producer p=new Producer(q);
Consumer c=new Consumer(q);
我如果改成
Producer p=new Producer(new Queue());
Consumer c=new Consumer(new Queue());
为什么在这个程序 这样改不行呢?
我在别的程序里 这样改是可以运行的。。这是为什么啊?
补充:同样的代码 运行时候会出现两种结果??。。。
追问:第2个我懂了。
第一个的话。 并不是抢的吧? 我写了wait和notify阿这个else 本来是没有的。然后我发现不对,我就写上了。 然后还是一样。我就删掉了。 删的时候没删干净。
答案:else//为空才+=v
value+=v;
isEmpty=false;
System.out.println("生产者共生产数量"+v);//加没加上都输出了生产数量,实际上一直是0
notify();
----------------------------------
notify有个问题是你无法保证程序一定是按照先wait再notify一步一步走来的
所以一般都会在进入方法前判断是否已经notify过,这样就不易死锁
你把两方法的if else再好好修改好逻辑 应该可以的
其他:第一个问题:
生产者和消费者是一种抢夺的关系,谁先抢到CPU谁的代码得到运行,而谁先抢到是随机的。也就是说不是生产者生产一个产品就等着消费者消费,消费者消费完了生产者才能生产。实际情况是这样的生产者生产产品和消费者是独立的,他们之间的联系时产品,只有有产品了消费者才能消费。
第二个问题:
楼主对于内存的分配不是特别清楚,修改前生产者和消费者之间的联系--产品,被保存在了一个队列中,这个队列是他们俩共享的,而如果传入两个 new Quere之后就变成了生产者生产的产品被保存在了一个队列,而消费者要消费的并不是这个队列,也就是说消费者消费的时候找不到东西了。不知道我这样说楼主能理解不。
上一个:如何成为java里的高深程序员?
下一个:怎么把android和web project结合起来