public class Producer implements Runnable{
private final Queue<String> queue;
private int maxSize;
public Producer(Queue<String> queue, int maxSize) {
this.queue = queue;
this.maxSize = maxSize;
}
@Override
public void run() {
while (true) {
String name = Thread.currentThread().getName();
try {
synchronized (queue) {
if (queue.size() < maxSize) {
queue.add(name + "做的肉包子");
System.out.println(name + "做了一个肉包子");
Thread.sleep(2000);
//使用当前同步锁对象调用notifyAll wait
queue.notifyAll();//唤醒别人
queue.wait();//等待自己
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
二、消费者
public class Consumer implements Runnable{
private final Queue<String> queue;
public Consumer(Queue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
String name = Thread.currentThread().getName();
try {
synchronized (queue) {
if (queue.size() > 0) {
String item = queue.remove();
System.out.println(name + "吃了" + item);
Thread.sleep(2000);
//使用当前同步锁对象调用notifyAll wait
queue.notifyAll();//唤醒别人
queue.wait();//等待自己
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
三、调用
public static void main(String[] args) {
Queue<String> queue = new LinkedList<String>();
int maxProducer = 2;
int maxConsumer = 3;
for (int i = 1; i <= maxProducer; i++) {
new Thread(new Producer(queue,maxProducer),"生产者" + i).start();
}
for (int i = 1; i <= maxConsumer; i++) {
new Thread(new Consumer(queue),"消费者" + i).start();
}
}