原理:
生产者-消费者(producer-consumer)是共享一个公共的固定大小的 缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入 一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费 者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。
公共资源
package test.thread.producer; import java.util.LinkedList; public class ShareResource { private LinkedList share = new LinkedList<>(); private int capacity = 20; public synchronized void addResource(Object resource) { if (isFull()) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } share.add(resource); notify(); } public synchronized Object get() { if (isEmpty()) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } notify(); return share.poll(); } public boolean isFull() { return share.size() == capacity; } public boolean isEmpty() { return share.isEmpty(); } }
//生产者
package test.thread.producer; import org.apache.log4j.Logger; public class Producer implements Runnable { private Logger log = Logger.getLogger(getClass()); private ShareResource sr; public Producer(ShareResource sr) { this.sr = sr; } public void product() { sr.addResource("添加任务"); log.debug("添加任务"); } @Override public void run() { while(true) { product(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
//消费者
package test.thread.producer; import org.apache.log4j.Logger; public class Customer implements Runnable { private ShareResource sr; private Logger log = Logger.getLogger(getClass()); public Customer(ShareResource sr) { this.sr = sr; } public void cust() { sr.get(); log.debug("消费任务"); } @Override public void run() { while(true) { try { cust(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package test.thread.producer; import org.junit.Test; public class TestCustomer { @Test public void test() { ShareResource sr = new ShareResource(); new Thread(new Producer(sr),"生产者线程1").start(); new Thread(new Producer(sr),"生产者线程2").start(); new Thread(new Customer(sr),"消费者线程1").start(); new Thread(new Customer(sr),"消费者线程2").start(); new Thread(new Customer(sr),"消费者线程3").start(); try { Thread.sleep(1000000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
相关推荐
java线程同步程序:消费者与生产者………………………………………………………………………………………………………………………………………………………………………………………………………………………………...
该资源包含了一个java线程安全以及生产者消费者demo,可以参考博客:
Java生产者与消费者Demo
java生产者消费者问题 java生产者消费者问题 java生产者消费者问题 java生产者消费者问题 java生产者消费者问题
//下面的消费者类对象和生产者类对象所操作的是同一个同步堆栈对象 Producer p1 = new Producer(stack,ce); new Thread(p1).start();//生产者线程启动 Consumer c1 = new Consumer(stack,ce); new Thread(c1)....
java多线程实现生产者和消费者
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
java的生产者消费者,thread生产者消费者、。。。。。。
用Java实现消费者与生产者两个线程进行调度
java 生产者消费者问题(源码) java 生产者消费者问题(源码)
java生成者与消费者实验报告内含封面代码和截图
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
java实现生产者消费者,生产者先生产,然后通知消费者消费,然后再通知生产者生产
Java SE程序 生产者+消费者Java SE程序 生产者+消费者Java SE程序 生产者+消费者Java SE程序 生产者+消费者Java SE程序 生产者+消费者Java SE程序 生产者+消费者Java SE程序 生产者+消费者Java SE程序 生产者+消费者...
java生产者消费者模型
基本满足操作系统课上要求,java实现的生产者消费者模型。
生产者消费者问题 Java实现 线程同步 线程通信生产者消费者问题 Java实现 线程同步 线程通信生产者消费者问题 Java实现 线程同步 线程通信
生产者与消费者问题,用java实现线程
生产者与消费者的问题一直都是初级编程这需要了解的内容。
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...