zoukankan      html  css  js  c++  java
  • 多线程生产消费者示例

    来自尚硅谷视频
    生产者将产品交给店员,而消费者从店员处取走产品
    店员一次只能持有固定数量产品(比如20),如果生产者试图生产更多产品,店员会叫生产者停一下,
    如果店中有空位放产品,再通知生产者继续生产,如果店中没有产品,店员会告诉消费者等一下,如果店中有产品再通知消费者来取走产品。
    问题分析: 是否是对线程问题? 是,生产者、消费者
          是否共享数据?是,店员、产品
          是否涉及线程通信? 是
          如何解决线程安全问题?同步机制
        


    //共享数据模块
    class Clerk {
    private int counter = 0;

    // 从生产者获取产品
    public synchronized void product() {
    if (counter < 20) {
    notify();
    counter++;
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + ":开始生产第" + counter + "个产品");
    } else {
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    //给顾客提供产品
    public synchronized void sale() {
    if (counter > 0) {
    notify();

    System.out.println(Thread.currentThread().getName() + ":开始消费第" + counter + "个产品");
    counter--;
    } else {
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }

    class Producter extends Thread {
    private Clerk clerk;

    public Producter(Clerk clerk) {
    this.clerk = clerk;
    }
    //生产产品
    public void run() {
    while (true) {
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.clerk.product();
    }
    }
    }

    class Custom extends Thread {
    private Clerk clerk;

    public Custom(Clerk clerk) {
    this.clerk = clerk;
    }
    //消费产品
    public void run() {
    while (true) {
    try {
    Thread.sleep(200);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.clerk.sale();
    }
    }
    }

    public class Thread007 {
    public static void main(String[] args) {
    Clerk clerk=new Clerk();
    Producter producter=new Producter(clerk);
    producter.setName("生产者");
    Custom custom = new Custom(clerk);
    custom.setName("消费者一");
    Custom custom1 = new Custom(clerk);
    custom1.setName("消费者二");
    producter.start();
    custom.start();
    custom1.start();
    }
    }
  • 相关阅读:
    Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Clien
    docker pull下载镜像报错Get https://registry-1.docker.io/v2/library/centos/manifests/latest:..... timeout
    Maven 插件之 docker-maven-plugin 的使用
    Windows10下的docker安装与入门 (一)使用docker toolbox安装docker
    解决IntelliJ IDEA 创建Maven项目速度慢问题
    svn检出maven项目的步骤
    学习RabbitMQ(三):AMQP事务机制
    TX-LCN分布式事务Demo实战
    SQLite -创建数据库
    备忘录模式
  • 原文地址:https://www.cnblogs.com/kukai/p/12589566.html
Copyright © 2011-2022 走看看