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();
    }
    }
  • 相关阅读:
    Eclipse/MyEclipse 选择Android NDK目录时提示“Not a valid NDK directory”
    Eclipse更改颜色主题
    Android模拟器访问本机服务器
    DIV水平垂直居中的CSS兼容写法
    Python3中使用PyMySQL连接Mysql
    Windows7 IE11 F12控制台DOC资源管理器报错的问题解决方法
    Windows 7无法卸载及安装IE11的解决方法
    查看端口占用
    VS2010/VS2013中ashx代码折叠的问题
    手机页面关于头部固定定位与input出现的问题
  • 原文地址:https://www.cnblogs.com/kukai/p/12589566.html
Copyright © 2011-2022 走看看