首页 > 代码库 > 生产者消费者 ProducerConsumer
生产者消费者 ProducerConsumer
生产者消费者是常见的同步问题。一个队列,头部生产数据,尾部消费数据,队列的长度为固定值。当生产的速度大于消费的速度时,队列逐渐会填满,这时就会阻塞住。当尾部消费了数据之后,生产者就可以继续生产了。
生产者
package com.example; import java.util.List; public class Producer { private List<String> list; public Producer(List<String> list){ this.list = list; } public void produce(String str){ synchronized (list){ if(list.size() >= ProducerConsumer.LIST_SIZE){ try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } list.add(0, str); System.out.println("produce item:"+str); } } }
消费者
package com.example; import java.util.List; public class Producer { private List<String> list; public Producer(List<String> list){ this.list = list; } public void produce(String str){ synchronized (list){ if(list.size() >= ProducerConsumer.LIST_SIZE){ try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } list.add(0, str); System.out.println("produce item:"+str); } } }
测试类
package com.example; import java.util.ArrayList; import java.util.List; public class ProducerConsumer { public static int LIST_SIZE = 3; public static void main(String[] args){ producerConsumerTest(); } private static void producerConsumerTest(){ List<String> list = new ArrayList<String>(); final Producer producer = new Producer(list); final Consumer consumer = new Consumer(list); new Thread(new Runnable() { @Override public void run() { int count = 0; while(true){ count++; producer.produce("num"+count); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { while(true){ int count = 0; while(true){ consumer.consume(); try { Thread.sleep(2500); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); } }
运行结果:
数据超过3个时候就不能生产了,需要等待消费者。
生产者消费者 ProducerConsumer
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。