缓冲区
public class Storage {
// 仓库最大存储量
private final int MAX_SIZE = 100;
// 仓库存储的载体
private LinkedList<Object> list = new LinkedList<Object>();
// 生产产品
public void produce() {
synchronized (list) {
// 满了
while (list.size() == MAX_SIZE) {
try {
list.wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
// 不满
list.add(new Object());
list.notifyAll();
}
}
// 消费产品
public void consume() {
synchronized (list) {
// 空了
while (list.size()==0) {
try {
list.wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
// 不空
list.remove();
list.notifyAll();
}
}
}
生产线程
public class Producer extends Thread {
private Storage storage;
public Producer(Storage storage){
this.storage = storage;
}
@Override
public void run(){
storage.produce();
}
}
消费线程
public class Consumer extends Thread {
private Storage storage;
public Consumer(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
storage.consume();
}
}
关键点注释
模型由3部分构成:缓冲区、生产线程、消费线程。其中最关键的是缓冲区的编写。
由于频繁做add/remove操作,所以应该使用链式存储的LinkedList、LinkedHashMap等结构。
生产方法和消费方法结构差不多,记住1个也就记住了另1个。
- 临界区为整个方法;
- while(条件变量),条件变量是缓冲区满了或空了;
- while中wait()交出CPU资源;
- while后执行add/remove操作;
- notifyAll()唤醒所有等待线程。