为什么跟着老师写的程序,修改过后还是出现有生产了之后,没有消费的情况,看了好久都不知道程序哪里错了

来源: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回答

irista23

2018-09-09

生产完毕,证明容器中已经有数据了,要将flag重新设置为true

http://img.mukewang.com/climg/5b94850800016c7811081064.jpg


0

进击的牙套仔

提问者

2018-09-07

第一行少了个p,复制的时候漏选了,请忽略

0

0 学习 · 7235 问题

查看课程