package cn.gao.algorithm2.service;
/*
* 经典的生产-消费者模式
* 最简单的就是一个生产者和一个消费者对共同的缓冲区对象进行操作
* 可扩展成多对多的生产者消费者模式
*/
public class Test9 {
/**
* @param args
*/
static int common=0;
/*box是生产消费者所操控的对象*/
static class Box{
public int values;/*缓冲区中的值*/
public boolean full=false;/*表示对象缓冲区中为满的状态*/
public synchronized int get()/*生产者调用对象*/
{
while(full==false)/*消费者需要等待缓冲区满才会去取其中的东西,不是满就一直等待*/
{
try {
wait();/*等待生产者产生满缓冲区,唤醒此物*/
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("消费者消费"+values);
full=false;
notifyAll();
return values;
}
public synchronized void put(int values)
{
while(full==true)/*只要缓冲区是满的,生产者就一直等待*/
{
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.values=values;
System.out.println("生产者生产"+values);
full=true;
notifyAll();
}
}
static class Productor extends Thread
{
private Box box;
public Productor(Box box) {
super();
this.box = box;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<6;i++)
{
box.put(common++);
/*
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
}
}
}
static class Comsumer extends Thread
{
private Box box;
public Comsumer(Box box) {
super();
this.box = box;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<6;i++)
{
box.get();
/*
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Box box=new Box();
Productor p1=new Productor(box);
Productor p2=new Productor(box);
Comsumer c1=new Comsumer(box);
Comsumer c2=new Comsumer(box);
p1.start();
p2.start();
c1.start();
c2.start();
}
}
分享到:
相关推荐
记录型信号量通常用于解决生产者-消费者问题,因为它可以记录缓冲池中的空缓冲区和满缓冲区的数量,从而实现生产者和消费者的同步。 解决生产者-消费者问题的方法 为了解决生产者-消费者问题,我们可以使用记录型...
通过这样的设计,可以实现生产者和消费者进程的并发执行,同时保证了资源的合理分配和避免了竞态条件的发生。这个模拟实现对于理解操作系统中的进程同步和互斥概念具有重要作用,也锻炼了编程和系统设计能力。
通过这次课程设计,我们不但加深了对操作系统的认识,还了解了操作系统中使用信号量解决生产者-消费者问题的算法实现。 多线程同步方法是解决生产者-消费者问题的有效方法之一,而信号量是解决生产者-消费者问题的...
1、设计目的:通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可...
在生产者-消费者问题中,可以使用互斥量(mutex)保证缓冲区的独占访问,以及使用条件变量(condition variable)实现生产者等待消费者消费或消费者等待生产者生产。 4. **互斥量**:互斥量用于实现对共享资源的...
以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...
在操作系统实验中,实现生产者-消费者模型可以帮助我们理解线程的同步机制,如互斥锁(mutex)和信号量(semaphore)。下面我们将详细探讨这两个概念以及如何在多线程环境下应用它们。 1. **互斥锁**:互斥锁是一种...
### 编程模拟实现生产者-消费者进程 #### 生产者-消费者问题概述 生产者-消费者问题是操作系统中进程间通信的经典案例之一。该问题主要描述了一组生产者进程不断生成数据并将其放置在一个共享缓冲区中,而一组消费...
在Linux中,可以使用POSIX信号量来实现生产者和消费者的同步。信号量是一种计数器,可以用来限制对临界资源的访问数量。在生产者-消费者问题中,我们可以创建一个互斥信号量用于控制对缓冲区的独占访问,以及一个...
结合System V信号量机制,利用Linux下的多线程库实现了Linux下的操作系统生产者-消费者模型,具体原理可参考博文:: http://blog.csdn.net/Mikeoperfect/article/details/79431642
"生产者-消费者的Linux多线程实现" 生产者-消费者问题简介 生产者-消费者问题是经典的进程同步互斥问题。本文将详细地阐述 Linux 下利用互斥锁、条件变量、线程管理等相关函数实现多线程生产者-消费者问题,以提高...
在实际的编程实现中,关键在于如何通过线程同步机制,如互斥锁、信号量等,来保证生产者不会在缓冲区满时继续生产,消费者也不会在缓冲区空时尝试消费。 1. **问题背景**: 生产者-消费者模型常用于描述现实世界中...
内含多个实验文档与可运行的代码 ...1. 生产者消费者对缓冲区进行互斥操作。 2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10次。
在某些实现中,信号量可以替代条件变量来实现生产者-消费者同步,但这里并未实际使用。 7. **线程创建与同步**:`pthread_create`函数用于创建新的线程,`pthread_join`用于等待线程结束。在主函数中,分别创建了...
在Windows操作系统环境下,我们可以利用Win32 API提供的线程同步功能来实现生产者-消费者问题。以下是一些关键的Win32 API函数: 1. **CreateMutex**: 用于创建一个互斥量对象,确保同一时间只有一个线程可以访问...
《生产者-消费者问题在C++中的实现》 生产者-消费者问题是多线程编程中的经典案例,它展示了如何在并发环境中实现线程间的同步与互斥。在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000...
在Java中,可以使用`BlockingQueue`接口来实现生产者-消费者模式,它已经内置了线程安全的队列操作。生产者可以使用`offer()`方法添加元素,消费者则用`take()`方法取出元素,这两个方法会自动处理等待和唤醒操作。 ...
设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...
在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者的模型。其中,`BlockingQueue`接口是一个重要的组成部分,它提供了线程安全的队列操作,支持阻塞的插入(put)和删除(take)操作,...