• 多线程编程实践——实现生产者、消费者模型


    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();
      }
    }
  • 相关阅读:
    Servlet(简介,请求参数,页面跳转,生命周期,创建,配置,ServletContext,线程)
    zookeeper 集群配置
    centos yum 安装 mariadb
    Oracle jdbc 插入 clob blob
    oracle 删除用户,提示“无法删除当前已连接的用户”
    oracle 创建表空间,用户并授权
    Linux 根分区扩容
    同时运行多个 tomcat 修改端口
    mysql新建用户及授权
    php sql 类似 mybatis 传参
  • 原文地址:https://www.cnblogs.com/binye-typing/p/9350021.html
Copyright © 2020-2023  润新知