为什么跟着老师写的程序,修改过后还是出现有生产了之后,没有消费的情况,看了好久都不知道程序哪里错了
来源:5-1 线程间通信
进击的牙套仔
2018-09-07 23:27:35
ackage com.imooc.queue;
public class Consumer implements Runnable {
Queue queue;
Consumer(Queue queue){
this.queue=queue;
}
@Override
public void run() {
while(true) {
queue.get();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}package com.imooc.queue;
public class Producer implements Runnable {
Queue queue;
Producer(Queue queue){
this.queue=queue;
}
@Override
public void run() {
int i=0;
while(true) {
queue.set(i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.imooc.queue;
public class Queue {
private int n;
boolean flag=false;
public synchronized int get() {
if(!flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("消费:"+n);
flag=false;//消费完毕
notifyAll();
return n;
}
public synchronized void set(int n) {
if(flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("生产:"+n);
this.n = n;
flag=false;//生产完毕
notifyAll();
}
}
package com.imooc.queue;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Queue queue=new Queue();
new Thread(new Producer(queue)).start();
new Thread(new Consumer(queue)).start();
}
}
2回答
生产完毕,证明容器中已经有数据了,要将flag重新设置为true

进击的牙套仔
提问者
2018-09-07
第一行少了个p,复制的时候漏选了,请忽略
相似问题