当前位置:编程学习 > JAVA >>

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结合起来

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,