package com.zjw;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
/**
* 生产者消费者问题
*/
public class JoinNotifyAllTest {
static class MyContainer<T> {
private List<T> container = new LinkedList<>();
private Integer maxSize;
private Integer size = 0;
MyContainer(Integer maxSize) {
this.maxSize = maxSize;
}
public synchronized void put(T t) throws InterruptedException {
if (size < maxSize) {
container.add(t);
size++;
System.out.println("+生产: " + t + ", current size: " + size);
this.notifyAll();
} else {
System.out.println("+++生产者等待...");
this.wait();
}
}
public synchronized void get() throws InterruptedException {
if (size == 0) {
System.out.println("---消费者等待...");
this.wait();
} else {
T tmp = container.remove(0);
size--;
System.out.println("-消费: " + tmp + ", current size: " + size);
this.notifyAll();
}
}
}
public static void main(String[] args) {
MyContainer<Integer> container = new MyContainer<>(5);
Random random = new Random();
// 生产者 5个
for (int i = 0; i < 5; i++) {
new Thread(() -> {
while (true) {
try {
TimeUnit.MILLISECONDS.sleep(random.nextInt(5000));
container.put(random.nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
// 消费者 5个
for (int i = 0; i < 5; i++) {
new Thread(() -> {
while (true) {
try {
TimeUnit.MILLISECONDS.sleep(random.nextInt(5000));
container.get();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
使用join和notifyAll实现经典的生产者消费者模型
最新推荐文章于 2024-09-15 19:46:31 发布