生产者消费者问题
wait-notify解决方法:
Buffer方法:对应的是进程的拿出和放入

import java.util.LinkedList; import static java.lang.Thread.sleep; public class Buffer { private final int MAX = 10; private LinkedList<Object> list = new LinkedList<>(); /** * @param value 生产产品的名字,是什么玩意 * @param time 生产者生产花费的时间 */ public void product(int value, int time){ synchronized (list){ while(list.size() == MAX){ System.out.println("仓库中已经放满"+MAX+"个仓品,达到上限,无法继续放入"); try { wait(); } catch (Exception e) { e.printStackTrace(); } } list.add(value); try { sleep(time*1000); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("生产者生产花费了"+time+"秒"); } System.out.println("生产者为:"+Thread.currentThread().getName()+"当前仓库容量为"+list.size()); System.out.println("-------------------------------"); list.notifyAll(); } } /** * 相应的对应上面的生产者,基本代码没有任何区别 * @param time */ public void consumer(int time){ synchronized (list){ { while(list.size() == 0){ System.out.println("仓库中已空,请等待生产者生产"); try { wait(); } catch (Exception e) { e.printStackTrace(); } } list.remove(); try { sleep(time*1000); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("消费者消费花费了"+time+"秒"); } System.out.println("消费者为:"+Thread.currentThread().getName()+"当前仓库容量为"+list.size()); System.out.println("-------------------------------"); list.notifyAll(); } } } }
Producer方法:对应的是product方法的引用

public class Producer implements Runnable{ private Buffer buffer; private String producter; public Producer(Buffer buffer){ this.buffer = buffer; } public String getProducter() { return producter; } public void setProducter(String producter) { this.producter = producter; } @Override public void run() { buffer.product((int)(Math.random()*10),(int)(Math.random()*10)); } }
Comsumer:方法对应的是comsumer方法的引用

public class Consumer implements Runnable{ private Buffer buffer; private String consumer; public Consumer(Buffer buffer){ this.buffer = buffer; } public String getConsumer() { return consumer; } public void setConsumer(String consumer) { this.consumer = consumer; } @Override public void run() { buffer.consumer((int)(Math.random()*10)); } }
Text:测试类

import java.lang.reflect.Field; public class text { public static void main(String[] args) throws ClassNotFoundException { Buffer buffer = new Buffer(); Thread producter1 = new Thread(new Producer(buffer)); Thread producter2 = new Thread(new Producer(buffer)); Thread producter3 = new Thread(new Producer(buffer)); Thread producter4 = new Thread(new Producer(buffer)); Thread comsumer1 = new Thread(new Consumer(buffer)); Thread comsumer2 = new Thread(new Consumer(buffer)); Thread comsumer3 = new Thread(new Consumer(buffer)); Thread comsumer4 = new Thread(new Consumer(buffer)); producter1.start(); producter2.start(); producter3.start(); producter4.start(); comsumer1.start(); comsumer2.start(); comsumer3.start(); comsumer4.start(); // people_Producer p = new people_Producer(); // Class clazz = p.getClass(); // Field[] fields = clazz.getDeclaredFields(); // for (Field field : // fields) { // // } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix