描述:共享变量池大小为5,生产者从池中放入一个物品,消费者从池中拿去一个物品。
一:定义共享资源:
public class PublicResources {
private int count = 0; // max = 5
public void reduce() { //消费者消费
synchronized(this) {
while(count <= 0) { //考虑为什么不用if而用while
// 试想当一个线程从wait状态被唤醒时,仍然可能出现没有资源的情况,所以这里需要用while来处理
try {
System.out.println("等待生产");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("consumer is reducing " + count);
count--;
notify(); //唤醒正在等待的生成者
}
}
public void add() {
synchronized(this) {
while(count >= 5) {
try {
System.out.println("等待消费");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println("producer is add " + count);
notify(); //唤醒正在等待的消费者
}
}
}
2、生产者模型:
/**生产者*/
public class Producer implements Runnable{
private PublicResources pr;
public Producer() {
// TODO Auto-generated constructor stub
}
public Producer(PublicResources pr) {
this.pr = pr;
}
@Override
public void run() {
for(int i = 0; i < 10; i++) {
try {
pr.add();
Thread.sleep(1000*(long)Math.random());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3、消费者模型:
/**消费者*/
public class Consumer implements Runnable{
private PublicResources pr;
public Consumer() {
// TODO Auto-generated constructor stub
}
public Consumer(PublicResources pr) {
this.pr = pr;
}
@Override
public void run() {
for(int i = 0; i < 10; i++) {
try {
pr.reduce();
Thread.sleep(1000*(long)Math.random());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
4、测试类:
public class Test_Producer_Consumer {
public static void main(String[] args) {
PublicResources ps = new PublicResources();
Thread thread1 = new Thread(new Producer(ps));
Thread thread2 = new Thread(new Consumer(ps));
Thread thread3 = new Thread(new Producer(ps));
Thread thread4 = new Thread(new Consumer(ps));
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
相关问题:
- Why do we need a while loop surrounding the wait?
- Why do we need notifyAll?
see https://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again