概念
生产者消费者模式,即N个人进行消费,N个人进行生产,共用一个资源池进行通信。(插一个常见解释图片)
1、生产者产生资源往池子里添加,前提是池子没有满,如果池子满了,则生产者暂停生产,直到自己的生成能放下池子。
2、消费者消耗池子里的资源,前提是池子的资源不为空,否则消费者暂停消耗,进入等待直到池子里有资源数满足自己的需求。
wait/sleep
项目 | wait | sleep |
---|---|---|
同步 | 只能在同步上下文中调用wait方法,否则或抛出IllegalMonitorStateException异常 | 不需要在同步方法或同步块中调用 |
作用 | wait 是让访问当前对象的线程休眠。 | sleep是让当前线程休眠 |
释放锁 | 是 | 否 |
唤醒条件 | 其他线程调用对象的notify()或者notifyAll()方法 | 超时或者调用interrupt()方法体 |
方法属性 | wait()是示例方法 | sleep()是静态方法 |
实现
Hamburger实体类
package com.company;
public class Hamburger {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return super.toString();
}
}
Container容器类
即图中的缓存区
package com.company;
public class Container {
public Hamburger[] array = new Hamburger[6];
public int index = 0;
public synchronized void push(Hamburger hamburger) {
while (index == array.length){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
array[index] = hamburger;
index++;
System.out.println("生产了一个汉堡"+hamburger);
}
public synchronized Hamburger pop() {
while (index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
System.out.println("消费了一个汉堡"+index);
return array[index];
}
}
Consumer消费者
package com.company;
import java.util.concurrent.TimeUnit;
public class Consumer {
private Container container;
public Consumer(Container container){
this.container = container;
}
public void consum() {
for (int i=0;i<30;i++) {
this.container.pop();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Producer生产者
package com.company;
import java.util.concurrent.TimeUnit;
public class Producer {
private Container container;
public Producer(Container container) {
this.container = container;
}
public void product() {
for (int i=0;i<30;i++) {
Hamburger hamburger = new Hamburger();
hamburger.setId(i);
this.container.push(hamburger);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}