# Java开发之生产者消费者问题 **Repository Path**: fpfgitmy_admin/java-develoment-product-consume ## Basic Information - **Project Name**: Java开发之生产者消费者问题 - **Description**: 生产者消费者描述 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2022-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 简单的生产者消费者 ``` package com.felixfei.study.threads; /** * @describle 线程的通信应用:生产者/消费者问题 * 生产者(Productor)将产品交给电源(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品,比如说20,如果 * 生产者试图生产跟多的产品,店员会叫生产者停一下,如果店中有空位房产品了再通知生产者继续生产:如果店中没有产品了,店员会告诉消费者等一下, * 如果店中有产品了再通知消费者来取走产品 *

* 这里可能出现两个问题: * 1. 生产者比消费者快时,消费者会漏掉一些数据没有取到 * 2. 消费者比生产者快时,消费者会取相同的数据 *

* 分析: * 1. 是否是多线程问题?是,生产者线程、消费者线程 * 2. 是否共享数据?有,店员或产品 * 3. 如果来解决线程的安全问题?同步机制,有三种方法同步代码块、同步方法、lock锁 * 4. 是否涉及到线程的通信?是,使用wait()、notify. */ class Clerk { private int num = 0; public synchronized void clerkProductor() { if (num < 20) { num++; System.out.println("生产了第" + num + "产品"); notify(); } else { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void clerkCustomer() { if (num > 0) { System.out.println("消费了第" + num + "产品"); num--; notify(); } else { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Productor extends Thread { private Clerk clerk; public Productor(Clerk clerk) { this.clerk = clerk; } @Override public void run() { System.out.println(Thread.currentThread().getName() + "开始生产"); while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } clerk.clerkProductor(); } } } class Customer extends Thread { private Clerk clerk; public Customer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { System.out.println(Thread.currentThread().getName() + "开始消费"); while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } clerk.clerkCustomer(); } } } public class productorAndCustomer { public static void main(String[] args) { Clerk clerk = new Clerk(); Productor productor = new Productor(clerk); Customer customer = new Customer(clerk); productor.setName("生产者"); customer.setName("消费者"); productor.start(); customer.start(); } } ```