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();
      }
    }
  • 相关阅读:
    单例设计模式
    MySQL数据类型
    MySQL创建、修改、删除数据库
    HTTP请求与响应
    netcore在CentOS7 下使用处理图片的问题
    SQL删除重复数据
    不同浏览器对cookie大小与个数的限制
    asp.net实现SQL2005的通知数据缓存
    MS SQL 设置自增长字段默认值
    MS SQL 批量操作
  • 原文地址:https://www.cnblogs.com/binye-typing/p/9350021.html
Copyright © 2011-2022 走看看