`

生产者-消费者实现(缓冲池为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)
分享到:
评论

相关推荐

    生产者-消费者问题的模拟实现(课设含源代码).doc

    用进程同步方法解决“生产者-消费者”问题,C或C++语言实现。 1、设计目的 通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。 2、设计要求 1)每个生产者和消费者对有界缓冲区进行操作后,即时显示...

    生产者-消费者问题.cpp

    使用一个数组来表示具有n个(0,1,…,n-1)缓冲区的缓冲池。用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,in加1;用一个输出指针out来指示下一个可从中获取产品的缓冲区,每当...

    用多进程同步方法演示“生产者-消费者”问题

    2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可在程序界面上设置 生产者和消费者进程的数目在程序界面上可调,在运行时可随时单个...

    编程模拟实现生产者-消费者进程

    为使生产者进程与消费者进程能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可以从一个缓冲区中取走产品去消费。尽管所有的生产者和消费者进程...

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

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

    操作系统课设用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为20个100以内的随机整数。 3、设计要求: 1) 生产者与消费者均...

    生产者消费者问题

    问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者...

    多线程同步方法解决生产者-消费者问题(linux线程实现)

    设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...

    操作系统课程设计生产者和消费者问题源代码

    ②从上边的测试数据文件例子可以看出,某一生产者生产一个产品后,可能不止一个消费者,或者一个消费者多次地请求消费该产品。此时,只有当所有的消费需求都被满足以后,该产品所在的共享缓冲区才可以被释放,并...

    编程实现生产者消费者或读写者的同步问题

    设计在同一个进程地址空间内执行...生产者线程生产物品时,若无空缓冲区可用,生产者线程必须等待消费者线程释放出一个空缓冲区;消费者线程消费物品时,若无满的缓冲区,消费者线程将被阻塞,直到新的物品被生产出来。

    生产者消费者实现进程的互斥和同步

    本实验要求设计在同一个进程地址...生产者线程生产物品时,若无空缓冲区可用,生产者线程必须等待消费者线程释放出一个空缓冲区;消费者线程消费物品时,若缓冲区为空,消费者线程将被阻塞,直到新的物品被生产出来。

    生产者-消费者模型模拟进程调度

    内含多个实验文档与可运行的代码 内容:编程实现生产者-消费者问题的模拟。...2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10次。

    多线程实现生产者---消费者模型

    操作系统实验 多线程实现生产者---消费者模型 华工版 绝对好用。。。。。。。

    生产者消费者访问同一缓冲区

    一个生产者和一个消费者访问同一缓冲区,缓冲区初始大小为10,(可以设定)。生产者产生随机数,消费者取走随机数,用同步和互斥实现,并在控制台打印,VC6.0编译成功

    生产者消费者问题(信号量)(linux)实现代码

    一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产...

    用多线程同步方法解决生产者-消费者问题

    1.每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符; 2.生产者和消费者各有两个以上; 3.多个生产者或多个消费者之间须共享对缓冲区进行...

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

    为使生产者进程和消费者进程能并发执行, 在它们之间设置了一个具有n个缓冲区的缓冲池, 生产者进程可将它所生产的消息放入一个缓冲区中, 消费者进程可从一个缓冲区中取得一个消息消费。 (2) 尽管所有的生产者进程和...

    使用多线程程序模拟实现单生产者/多消费者问题(Linux下C语言)。

    要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将这个整数加 4 后输出。当程序接收到键盘输入“q”...

    Linux下生产者消费者问题的实现

    一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界...

Global site tag (gtag.js) - Google Analytics