首先是Productor.java
package org.iteye.bbjava.currency.pc;
public class Productor implements Runnable {
CQueue<String> queue;
int i = 0;
public Productor(CQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
while (!Thread.interrupted()) {
if (queue.size() > 200) {
System.out.println("仓库满了,productor 休息一下");
} else {
try {
System.out.println(".");
Thread.sleep(500);
queue.add(""+i++);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
接下来是仓库 CQueue.java
package org.iteye.bbjava.currency.pc;
import java.util.LinkedList;
import java.util.Queue;
public class CQueue<T> {
public Queue<T> queue = new LinkedList<T>(); ;
public CQueue(){
}
public synchronized T poll() { //consumer 从仓库取出产品
if(queue.size() <= 0 ){
try {
System.out.println("仓库空了,里面没东西,consumer 休息一下 size:"+queue.size());
wait(1200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
notify();
}
return queue.poll();
}
public synchronized void add(T elem){
if(queue.size() >= 200){
try {
System.out.println("仓库满了,容不下更多东西了,productor 休息一下 size:"+queue.size());
wait(1200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
queue.add(elem);
notify();
}
}
public int size(){
return queue.size();
}
}
再者是Consumer.java
package org.iteye.bbjava.currency.pc;
import java.util.Queue;
public class Consumer implements Runnable {
CQueue<String> queue;
@Override
public void run() {
while (!Thread.interrupted()) {
if (queue.size() < 0) {
System.out.println("仓库空了,consumer 休息");
} else {
try {
Thread.sleep(500);
System.out.println(this.consume());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public Consumer(CQueue<String> queue) {
this.queue = queue ;
}
public String consume(){
return this.queue.poll();
}
}
客户端 TestProductorAndConsumer .java
package org.iteye.bbjava.currency.pc;
public class TestProductorAndConsumer {
public static void main(String []args){
CQueue<String> cq = new CQueue<String>();
System.out.println(cq.size());
Thread t2 = new Thread(new Productor(cq));
Thread t3 = new Thread(new Productor(cq));
Thread t1 = new Thread(new Consumer(cq));
Thread t4 = new Thread(new Consumer(cq));
t4.start();
t3.start();
t2.start();
t1.start();
}
}
生产者与消费者,纯回顾一下,手写的,主要是加深印象。
待整理……
分享到:
相关推荐
在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者”问题,可以帮助我们更好的理解进程同步的概念及实现方法。掌握线程创建和终止的方法,加深对线程和进程概念的理解,会用同步与互斥方法实现线程...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制. 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数. 设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
本课程设计的目的是通过设计一个消费者进程与生产者进程的同步模拟系统,认识进程间的同步机制生产者消费者问题是一个著名的进程同步问题。 (1) 有一群生产者进程在生产消息, 并将消息提供给消费者进程去消费。为...
本程序在界面上使用了Java的swing接口函数,用矩形条表示生产者进程中待生产的产品,并设置了三个分区分别表示生产者进程待生产的产品、公共缓冲池中已生产的产品和消费者进程已消费的产品,以动画的效果动态演示了...
多线程并发 生产者 消费者 java 简单实用
而本程序正是基于这种思想设计出来的,用来模拟生产者消费者问题的解决过程。 本程序在运行时提供友好的交互界面,且操作简单,在模拟过程中各种情况有相应文字提示,并伴有相应的图像变化,如:当没有产品可消费的...
生产者消费者synchronized实现方式
os课程设计、通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制
(1)设置存放产品的缓冲区的个数为6个。 (2)信号量机制实现生产者和消费者对缓冲区的互斥访问。 (3)生产者生产产品时,要输出当前缓冲区冲产品的个数和...(5)用多线程的并发实现生产者进程和消费者进程的同步。
5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
学习Java线程之并发协作生产者消费者模型.pdf
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释...Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...