生产者:向仓库容器container中填充对象,直到达到设置的库存上限MAX,然后就wait等待,并且通知叫醒notify消费者去消费。
生产者代码:
- import java.util.List;
- public class Product implements Runnable {
- private List container = null;
- private int count;
- public Product(List lst) {
- this.container = lst;
- }
- public void run() {
- while (true) {
- synchronized (container) {
- if (container.size() > MultiThread.MAX) {
- try {
- container.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- container.add(new Object());
- container.notify();
- System.out.println("我生产了" + (++count) + "个");
- }
- }
- }
- }
消费者:消费仓库container中的货物,当库存为空等于0时就停止等待wait并且通知叫醒notify生产者。
消费者代码:
- import java.util.List;
- public class Consume implements Runnable {
- private List container = null;
- private int count;
- public Consume(List lst) {
- this.container = lst;
- }
- public void run() {
- while (true) {
- synchronized (container) {
- if (container.size() == 0) {
- try {
- container.wait();// 放弃锁
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- container.remove(0);
- container.notify();
- System.out.println("我吃了" + (++count) + "个");
- }
- }
- }
- }
运行演示:启动了一个生产者和一个消费者,可以从控制台看到生产和消费的情况。
代码:
- import java.util.ArrayList;
- import java.util.List;
- public class MultiThread {
- private List container = new ArrayList();
- public final static int MAX = 5;
- public static void main(String args[]) {
- MultiThread m = new MultiThread();
- new Thread(new Consume(m.getContainer())).start();
- new Thread(new Product(m.getContainer())).start();
- }
- public List getContainer() {
- return container;
- }
- public void setContainer(List container) {
- this.container = container;
- }
- }