`
chriszeng87
  • 浏览: 717463 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java并发之生产者消费者

    博客分类:
  • Java
 
阅读更多

这个例子有点局限,消费者每次只能等生产者生产了n个Q后消费完这n个。

 

 

package com.test;

class Q { 
	int n; 
	boolean valueSet = false; //Q的value是不是已经设置过了
	synchronized int get() { 
		if(!valueSet) 
			try { 
				wait(); //wait until Producer produce a product and notify ,释放锁
			} catch(InterruptedException e) { 
				System.out.println("InterruptedException caught"); 
			} 
		System.out.println("Got: " + n); 
		valueSet = false; 
		notify(); 
		return n; 
	} 
	
	synchronized void put(int n) { 
		if(valueSet) 
			try { 
				wait(); 
			} catch(InterruptedException e) { 
				System.out.println("InterruptedException caught"); 
			} 
		this.n = n; 
		valueSet = true; 
		System.out.println("Put: " + n); 
		notify(); 
	} 
}

class Producer implements Runnable { 
	Q q;
	
	Producer(Q q) { 
		this.q = q; 
		new Thread(this, "Producer").start(); 
	}
	
	public void run() { 
		int i = 0; 
		while(true) { 
			q.put(i++); 
		} 
	} 
}

class Consumer implements Runnable { 
	Q q;
	
	Consumer(Q q) { 
		this.q = q; 
		new Thread(this, "Consumer").start(); 
	} 
	
	public void run() { 
		while(true) { 
			q.get(); 
		}	 
	} 
}

class PCFixed { 
	public static void main(String args[]) { 
		Q q = new Q(); 
		new Consumer(q); 
		new Producer(q); 

		System.out.println("Press Control-C to stop."); 
	} 
}

 

 

下面的方法转自《程序员面试攻略》第二版,机械工业出版社,P118-P119,应该是正确的解答:

 

生产者:

 

 

public class Producer extends Thread {
      private IntBuffer buffer;
      
      public Producer(IntBuffer buffer) {
            this.buffer = buffer;
      }
 
      public void run() {
            Random r = new Random();
            while(true) {
                    int num = r.nextInt();
                    buffer.add(num);
                    System.out.println("Produced " + num);
            }
      }
}

 

消费者:

 

public class Consumer extends Thread {
	private IntBuffer buffer;
	
	public Consumer(IntBuffer buffer) {
		this.buffer = buffer;
	}
	
	public void run() {
		while(true) {
			int num = buffer.remove();
			System.out.println("Consumed " + num);
		}
	}
}

 

缓冲区:

 

public class IntBuffer {
	private int index;
	private int[] buffer = new int[8];
	
	public synchronized void add( int num ) {
		while(index == buffer.length-1) {
			try {
				wait();
			}catch(InterruptedException e) {

			}
		}

		buffer[index++] = num;
		notifyAll();
	}

	public synchronized int remove() {
		while(index == 0) {
			try {
				wait();
			}catch(InterruptedException e) {

			}			
		}
		
		int ret = buffer[--index];
		notifyAll();
		return ret;
	}
}
这段代码允许多个生产者和多个消费者使用同一个缓冲区,解决了第一个方法的缺陷。
分享到:
评论

相关推荐

    学习Java线程之并发协作生产者消费者模型.pdf

    学习Java线程之并发协作生产者消费者模型.pdf

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    多线程并发 生产者 消费者 java

    多线程并发 生产者 消费者 java 简单实用

    生产者消费者问题java的java编写的

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制. 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数. 设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后...

    操作系统课程设计——模拟生产者与消费者(java)

    在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者”问题,可以帮助我们更好的理解进程同步的概念及实现方法。掌握线程创建和终止的方法,加深对线程和进程概念的理解,会用同步与互斥方法实现线程...

    生产者消费者实验报告.doc

    (1)设置存放产品的缓冲区的个数为6个。 (2)信号量机制实现生产者和消费者对缓冲区的互斥访问。 (3)生产者生产产品时,要输出当前缓冲区冲产品的个数和...(5)用多线程的并发实现生产者进程和消费者进程的同步。

    生产者消费者问题JAVA实现代码

    os课程设计、通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制

    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...

    模拟仿真“生产者-消费者”问题的解决过程及方法

    本课程设计的目的是通过设计一个消费者进程与生产者进程的同步模拟系统,认识进程间的同步机制生产者消费者问题是一个著名的进程同步问题。 (1) 有一群生产者进程在生产消息, 并将消息提供给消费者进程去消费。为...

    生产者消费者模式

    生产者消费者synchronized实现方式

    java并发学习之BlockingQueue实现生产者消费者详解

    主要介绍了java并发学习之BlockingQueue实现生产者消费者详解,具有一定参考价值,需要的朋友可以了解下。

    操作系统课设-生产者消费者问题.zip

    而本程序正是基于这种思想设计出来的,用来模拟生产者消费者问题的解决过程。 本程序在运行时提供友好的交互界面,且操作简单,在模拟过程中各种情况有相应文字提示,并伴有相应的图像变化,如:当没有产品可消费的...

    Java并发编程实践 PDF 高清版

    5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 Synchronizer 5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 Executor 框架 6.3 ...

    Java——生产者-消费者问题

    本程序在界面上使用了Java的swing接口函数,用矩形条表示生产者进程中待生产的产品,并设置了三个分区分别表示生产者进程待生产的产品、公共缓冲池中已生产的产品和消费者进程已消费的产品,以动画的效果动态演示了...

    龙果java并发编程完整视频

    第30节通过生产者消费者模型理解等待唤醒机制00:20:50分钟 | 第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition...

    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...

    Java并发编程原理与实战

    通过生产者消费者模型理解等待唤醒机制.mp4 Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与...

    java 多线程并发实例

    代码里面包含一个并发4个线程同时运行 全部开始 全部停止 单个停止还有点问题。 还有生产者消费者 里面的里面能帮助你理解多线程的运用!

    Java多线程并发生产者消费者设计模式实例解析

    主要介绍了Java多线程并发生产者消费者设计模式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics