zoukankan      html  css  js  c++  java
  • 多线程编程实践——实现生产者、消费者模型

    class Clerk {
      private int products;
      private int maximum;      // 最大储货量
      public Clerk(int maxmum) {
        this.maximum = maxmum;
      }
      public synchronized void addProduct() {
        if (products >= maximum) {
          try {
            wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        } else {
          products++;
          System.out.println(Thread.currentThread().getName() + "到货第 " + products + "个产品");
          notifyAll();
        }
      }
      public synchronized void saleProduct() {
        if (products > 0) {
          System.out.println(Thread.currentThread().getName() + "买走第 " + products + "个产品");
          products--;
          notifyAll();
        } else {
          try {
            wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
    
    class Producer implements Runnable{
      private Clerk clerk;
      public Producer(Clerk clerk) {
        this.clerk = clerk;
      }
      public void run() {
        while (true) {
          clerk.addProduct();
          try {
            Thread.currentThread().sleep(1);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
    class Consumer implements Runnable {
      private Clerk clerk;
      public Consumer(Clerk clerk) {
        this.clerk = clerk;
      }
      public void run() {
        while (true) {
          clerk.saleProduct();
          try {
            Thread.currentThread().sleep(10);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
    
    /**
     * Created by bruce on 2018/7/22.
     */
    public class ProducerAndConsumer {
      public static void main(String[] args) {
        Clerk clerk = new Clerk(20);
        Thread t1 = new Thread(new Producer(clerk));
        Thread t2 = new Thread(new Consumer(clerk));
        Thread t3 = new Thread(new Consumer(clerk));
        Thread t4 = new Thread(new Consumer(clerk));
        t1.setName("生产者");
        t2.setName("消费者1");
        t3.setName("消费者2");
        t4.setName("消费者3");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
      }
    }
  • 相关阅读:
    spark dataframe 正则表达式匹配
    JVM申请的memory不够导致无法启动SparkContext
    <scope>provided</scope> 关于maven依赖中的scope的作用和用法
    web前端网站
    元素居中
    如何在Vue项目中使用vw实现移动端适配
    微任务、宏任务、同步、异步、Promise、Async、await
    前端自动化工作流环境
    Web前端学习笔记——构建前端自动化工作流环境
    JS判断值是否是数字
  • 原文地址:https://www.cnblogs.com/binye-typing/p/9350021.html
Copyright © 2011-2022 走看看