美文网首页
【基础】- 生产者消费者-等待唤醒机制 (经典Demo)

【基础】- 生产者消费者-等待唤醒机制 (经典Demo)

作者: lconcise | 来源:发表于2021-02-08 07:49 被阅读0次

等待唤醒机制的应用场景很多,记录这个Demo,强化下。

抽象类

public abstract class Ticket implements Runnable {

    /**
     * 锁.
     */
    protected Object lock;

    /**
     * 共享资源:票.
     */
    protected static int ticket = 0;

    public Ticket(Object lock) {
        this.lock = lock;
    }
}

生产者

public class Producer extends Ticket {

    public Producer(Object lock) {
        super(lock);
    }

    @Override
    public void run() {
        while (true) {
            synchronized (lock) {
                if (ticket < 10) {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("生产ticket,现有 " + ++ticket + " 张票");

                    lock.notifyAll();
                } else {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

消费者

public class Consumer extends Ticket {

    public Consumer(Object lock) {
        super(lock);
    }

    @Override
    public void run() {
        while (true) {
            synchronized (lock) {
                if (ticket > 0) {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("消费,剩余 " + --ticket + " 张票");

                    lock.notifyAll();
                } else {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

启动生产者、消费者

public class Demo01 {

    public static void main(String[] args) {

        Object lock = new Object();

        Consumer consumer = new Consumer(lock);
        Producer producer = new Producer(lock);

        Thread consumer01 = new Thread(consumer);
        Thread consumer02 = new Thread(consumer);
        Thread consumer03 = new Thread(consumer);

        Thread producer01 = new Thread(producer);

        consumer01.start();
        consumer02.start();
        consumer03.start();
        producer01.start();
    }
}

执行结果:

生产ticket,现有 1 张票
生产ticket,现有 2 张票
生产ticket,现有 3 张票
生产ticket,现有 4 张票
生产ticket,现有 5 张票
生产ticket,现有 6 张票
生产ticket,现有 7 张票
生产ticket,现有 8 张票
消费,剩余 7 张票
消费,剩余 6 张票
消费,剩余 5 张票
消费,剩余 4 张票
消费,剩余 3 张票
消费,剩余 2 张票
消费,剩余 1 张票
消费,剩余 0 张票
生产ticket,现有 1 张票
生产ticket,现有 2 张票
····(循环)

相关文章

  • 【基础】- 生产者消费者-等待唤醒机制 (经典Demo)

    等待唤醒机制的应用场景很多,记录这个Demo,强化下。 抽象类 生产者 消费者 启动生产者、消费者 执行结果:

  • java多线程之线程间的通信(wait,notify)

    一、入门demo,实现经典的生产者消费者模型 消费者 生产者 测试类 输出控制台打印结果 二、关于通知等待机制 其...

  • JUC中线程之间得通信

    使用synchronized实现线程间通信,线程间通信:1、生产者+消费者2、通知等待唤醒机制.多线程编程模板:1...

  • 基于Java 生产者消费者模式(详细分析)

    本文目录: 1.等待、唤醒机制的原理 2.Lock和Condition 3.单生产者单消费者模式 4.使用Lock...

  • ios 生产者和消费者问题

    场景:消费者:如果当前产品为0 的话,就等待; 生产者:生产一个产品,消费者唤醒,消费一个产品,继续等待 实现:

  • 生产者消费者模型

    生产者/消费者模式实现 等待/通知模式最经典的案例就是“生产者/消费者模式”模式。但此模式在使用上有几种“变形”,...

  • Future

    Future 模式只是生产者-消费者模型的扩展。经典“生产者-消费者”模型中消息的生产者不关心消费者何时处理完该条...

  • 生产者和消费者

    生产者和消费者介绍 生产者和消费者是一个经典的问题,生产者负责生产,生产的东西放入buffer,消费者负责消费,从...

  • Java生产者/消费者模型的一种实现

    本文主要介绍java中生产者/消费者模式的实现,对java线程锁机制的一次深入理解。 生产者/消费者模型 生产者/...

  • 生产者消费者模型Java实现

    生产者消费者模型 生产者消费者模型可以描述为:①生产者持续生产,直到仓库放满产品,则停止生产进入等待状态;仓库不满...

网友评论

      本文标题:【基础】- 生产者消费者-等待唤醒机制 (经典Demo)

      本文链接:https://www.haomeiwen.com/subject/axpztltx.html