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();
      }
    }
  • 相关阅读:
    CURL常用命令
    极客无极限 一行HTML5代码引发的创意大爆炸
    JS的prototype和__proto__(含es6的class)
    leetcode 44:construct-binary-tree-from-preorder-and-inorder
    leetcode 43:construct-binary-tree-from-inorder-and-postorder
    leetcode 42:binary-tree-level-order-traversal-ii
    leetcode 38:path-sum
    leetcode 37:path-sum-ii
    leetcode 33:pascals-triangle
    leetcode 32:pascals-triangle-ii
  • 原文地址:https://www.cnblogs.com/binye-typing/p/9350021.html
Copyright © 2011-2022 走看看