`

生产者-消费者实现(缓冲池为1,用一个整数表示一个产品)

阅读更多
转自http://www.riabook.cn/doc/designpattern/ProducerConsumer.htmProducer Consumer模式与 Guarded Suspension 模式 是类似的,只不过Guarded Suspension模式并不限制缓冲区的长度,Producer Consumer模式假设所生产的产品放置在一个长度有限制的缓冲区(就像是一个产品桌,它可以摆放的空间是有限的),如果缓冲区满了,则生产者必须停止继续将产品放到缓冲区中,直到消费者取走了产品而有了空间,而如果缓冲区中没有产品,当然消费者必须等待,直到有新的产品放到缓冲区中。

以下是一个最简单的:生产者每次生产一个整数并放置在桌子上,而消费者消耗整数,桌子上一次只能放置一个整数,如果桌子上已有整数,则生产者等待消费者将整数消耗并通知生产者生产下一个整数,如果桌子上没有整数,则消费者等待生产者生产整数并通知消费者可以消耗整数。

package cache;
//生产者
public class Producer extends Thread {
	private ProductTable productTable;

	public Producer(ProductTable productTable) {
		this.productTable = productTable;
	}

	public void run() {
		System.out.println("Produce integer......");
		for (int product = 1; product <= 10; product++) {
			try { // wait for a random time
				Thread.sleep((int) Math.random() * 3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			productTable.setIntProduct(product); //向桌面放置一个整数,代表生成了一个产品
		}
	}
}

package cache;
//消费者
public class Consumer extends Thread {
	private ProductTable productTable;

	public Consumer(ProductTable productTable) {
		this.productTable = productTable;
	}

	public void run() {
		System.out.println("Comsume integer......");
		for (int i = 1; i <= 10; i++) {
			try { // wait for a random time
				Thread.sleep((int) (Math.random() * 3000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			productTable.getProductInt(); //从桌面取出一个整数,代表消耗一个产品
		}
	}
}


package cache;

public class ProductTable { //充当缓冲池
	private int productInt = -1; // -1 for no product

	public synchronized void setIntProduct(int product) {
		if (productInt != -1) { //如果还有产品,先等待,说明一次只能生成一个,直到这个消耗完之后才能生成下一个
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		productInt = product;
		System.out.println("set (" + product + ")");
		notify(); //通知消费者已经生产了一个产品
	}

	public synchronized int getProductInt() {
		if (productInt == -1) { //如果没有产品,等待
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		int p = productInt;
		System.out.println("Get (" + productInt + ")");
		productInt = -1;  //消费完了,无产品了,
		notify(); //通知生产者
		return p;
	}
}

测试的客户端:
package cache;

public class Client {

//	生产者会生产10个整数,而消费者会消耗10个整数,由于桌上只能放置一个整数,所以每生产一个就消耗一个。

	public static void main(String[] args) {

		ProductTable table = new ProductTable();
		table.setIntProduct(-1);
		Consumer c= new Consumer(table);
		c.start();
		
		Producer p = new Producer(table);
		p.start();
		
	}

}

测试结果:
set (-1)
Comsume integer......
Produce integer......
set (1)
Get (1)
set (2)
Get (2)
set (3)
Get (3)
set (4)
Get (4)
set (5)
Get (5)
set (6)
Get (6)
set (7)
Get (7)
set (8)
Get (8)
set (9)
Get (9)
set (10)
Get (10)
分享到:
评论

相关推荐

    用信号量解决生产者-消费者问题.zip

    建立一个生产者进程,N 个消费者进程(N &gt; 1) 用文件建立一个共享缓冲区 生产者进程依次向缓冲区写入整数 0,1,2,…,M, M &gt;= 500 消费者进程从缓冲区读数,每次读一个,并将读出的数字从缓冲区删除,然后将本进程 ID+ ...

    操作系统实验报告--经典的生产者—消费者问题(6).doc

    生产者—消费者问题是典型的 PV 操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。 实验的主要...

    生产者-消费者:一个生产者和n个消费者问题(m个元素和共享内存)

    一个生产者和n个消费者共享内存 在此模拟中,一个生产者将m个元素发送给n个消费者。 这些元素以一个元素的容量存储在共享内存段中。 每个元素都包含一个随机整数和一个时间戳。 在模拟结束时,每个使用者将其pid,m...

    JAVA编写的生产者消费者问题.doc

    3. **缓冲池类(Data)**:这是关键的同步组件,它使用了一个数组 `buffer` 来存储产品,以及一个整数 `top` 来跟踪当前缓冲池的满/空状态。`Data` 类中的 `put()` 和 `take()` 方法都使用了 `synchronized` 关键字...

    3.3 信号量与PV操作.pptx

    例如,在生产者-消费者问题中,可以使用信号量来确保缓冲池中有足够的空间供生产者使用,以及有足够的产品供消费者消费。 ### Linux系统中的同步互斥功能 在Linux系统中,提供了多种机制来支持进程间的同步和互斥...

    Python实现的生产者、消费者问题完整实例

    每个生产者线程都会随机生成一个整数并尝试放入缓冲池。如果缓冲池已满,生产者会等待。同样,每个消费者线程会尝试从缓冲池取出数据。如果缓冲池为空,消费者会等待。通过使用`with lock:`语句,我们可以确保在对...

    缓冲池 java

    在Java编程中,缓冲池(Buffer Pool)是一个重要的概念,特别是在处理I/O操作时。缓冲池是一种内存管理技术,用于优化数据访问效率,减少磁盘I/O操作,并提高整体系统性能。它通过预先分配和复用内存块来实现这一...

    JAVA程序员常见的面试题

    使用断言的格式通常是 `assert &lt;boolean expression&gt; : &lt;message&gt;`,其中 `&lt;boolean expression&gt;` 是一个布尔表达式,如果为 false,则会抛出 `AssertionError`,并附带 `&lt;message&gt;` 作为异常信息。 #### 七、垃圾...

    09淘宝校园招聘笔试题

    **完成一段代码,代码有三个线程,主线程由Main进入,启动一个生产者线程和一个消费者线程,生产者线程随机产生整数,并且把这个整数放入一个List中,消费者从List中取出数据进行显示** - **分析:** - 使用Java的...

    Go Concurrency .pptx

    - **生产者消费者模式**:通过通道连接生产者与消费者,实现无锁的并发编程。 - **工作池模式**:通过固定大小的工作队列和通道来限制goroutine的数量,避免资源过度消耗。 - **Fan-in/Fan-out模式**:使用通道进行...

    JAVA上百实例源码以及开源项目源代码

    数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...

    java面试题

    11. 数组与字符串的length属性或方法:在Java中,数组类有一个名为length的属性,表示数组的长度。而String类则有一个名为length()的方法,用于返回字符串的长度。 12. 方法重载(Overload)与重写(Override)的...

    JAVA面试题集整理

    例如,先将GB2312编码的字符串转换为字节数组,然后再使用ISO-8859-1编码重新构建一个新的字符串。 2. **数据库操作**: - **问题**:Statement和PreparedStatement的区别是什么? - **解释**:`Statement` 用于...

    阿里巴巴校园招聘历年经典面试题汇总:C++研发 1

    63. **生产者消费者模型**:生产者生产数据,消费者消费数据。是线程同步的经典模型。 64. **GET/POST区别**:GET是幂等的,数据在URL中;POST用于提交数据。安全性可通过加密、验证等方式提升。 65. **服务器压力...

    MySQL性能优化详解.docx

    - **调整MySQL配置**: 根据服务器的硬件资源和应用需求,调整MySQL的各项参数,如缓冲池大小、最大连接数等,以提高性能。 #### 四、存储引擎优化 MySQL支持多种存储引擎,每种引擎都有其特点和适用场景。例如,...

    Sybase ASE 15.7 开发文档:系统管理指南(卷二)

    由于页的使用而不能删除缓冲池时 .......... 99 高速缓存绑定对内存和查询计划的影响 .......... 99 从高速缓存中刷新页 .......... 99 锁定以执行绑定 .......... 99 高速缓存绑定对存储过程和触发器的影响 ..........

Global site tag (gtag.js) - Google Analytics