生产者消费者(二)
package com.charles.algorithm; import java.util.LinkedList; public class ProducerConsumer { /** * @Desc: multiple sub-classes */ static final int MAX_SIZE = 10; LinkedList<Integer> list = new LinkedList<Integer>(); public static void main(String[] args) { ProducerConsumer pc = new ProducerConsumer(); Consumer consumer = pc.new Consumer(); Producer producer = pc.new Producer(); // define 4 producers for (int i = 0; i < MAX_SIZE / 3 + 1; i++) { new Thread(producer).start(); } // define 3 consumers for (int i = 0; i < MAX_SIZE / 3; i++) { new Thread(consumer).start(); } } class Producer implements Runnable { @Override public void run() { while (true) { produce(); } } private void produce() { synchronized (list) { while (MAX_SIZE <= list.size()) { try { System.out.println("Producer-" + Thread.currentThread().getName() + " Waiting..."); list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } sleep(); list.add(list.size() + 1); list.notifyAll(); System.out.println("Producer-" + Thread.currentThread().getName() + " produce:" + list.size() + " left: " + list.size()); } } } class Consumer implements Runnable { @Override public void run() { while (true) { consume(); } } private void consume() { synchronized (list) { while (0 >= list.size()) { try { System.out.println("Consumer-" + Thread.currentThread().getName() + " Waiting..."); list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } sleep(); int num = list.pollLast(); System.out.println("Consumer-" + Thread.currentThread().getName() + " consume: " + num + " left: " + list.size()); list.notifyAll(); } } } private void sleep() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步