Java多线程之生产者消费者问题

    xiaoxiao2025-03-28  9

    <span style="font-size:14px;">package cn.edu.qianfeng; /* * 生产者与消费者问题需要考虑以下几个问题: * 1.是否涉及到多线程问题? * 答:是! 生产者、消费者 * 2.是否涉及到共享数据? * 答:是! 产品的数量。有共享数据就要考虑线程的安全问题 * 3.是否涉及到线程的通信? * 答:是! 存在生产者和消费者之间的通信--同步(<span style="font-family: Arial, Helvetica, sans-serif;">synchronized)</span> */ public class 生产者与消费者 { public static void main(String[] args) { Clerk clerk = new Clerk(); Producer p = new Producer(clerk); Consumer c = new Consumer(clerk); Thread t1 = new Thread(p, "生产者1"); Thread t2 = new Thread(p, "生产者2"); Thread t3 = new Thread(c, "消费者1"); t1.start(); t2.start(); t3.start(); } } /* * 店员 */ class Clerk{ int product; //产品的数量(共享数据) //生产产品(因为涉及到共享数据,所以要声明为同步方法) public synchronized void addProduct(){ if (product >= 20) { try { wait(); //等待,释放锁 } catch (InterruptedException e) { e.printStackTrace(); } }else { product ++; System.out.println(Thread.currentThread().getName() + "生产了第" + product + "个产品"); notifyAll(); //唤醒消费者线程 } } //消费产品(因为涉及到共享数据,所以要声明为同步方法) public synchronized void consumeProduct(){ if (product <= 0) { try { wait(); //等待,释放锁 } catch (InterruptedException e) { e.printStackTrace(); } }else { System.out.println(Thread.currentThread().getName() + "消费了第" + product + "个产品"); product --; notifyAll(); //唤醒生产者线程 } } } /* * 生产者 */ class Producer implements Runnable{ Clerk clerk; public Producer(Clerk clerk){ this.clerk = clerk; } @Override public void run() { System.out.println(Thread.currentThread().getName() + "开始生产产品"); while (true) { try { Thread.currentThread().sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } clerk.addProduct(); } } } /* * 消费者 */ class Consumer implements Runnable{ Clerk clerk; public Consumer(Clerk clerk){ this.clerk = clerk; } @Override public void run() { System.out.println(Thread.currentThread().getName() + "开始消费产品"); while (true) { try { Thread.currentThread().sleep(60); } catch (InterruptedException e) { e.printStackTrace(); } clerk.consumeProduct(); } } }</span>
    转载请注明原文地址: https://ju.6miu.com/read-1297469.html
    最新回复(0)