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

生产者和消费者同步线程

阅读更多
public class HoldIntegerSynchronized 
{
	private int sharedInt=-1;
	private boolean writeable=true;
	
	public synchronized void setSharedInt(int val)
	{
		while(!writeable)
		{
			try
			{
				wait();
			}
			catch(InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		
		System.err.println(Thread.currentThread().getName()+
		                   "setting sharedInt to"+val);
		sharedInt=val;
		writeable=false;
		notify();
	}
	
	public synchronized int getSharedInt()
	{
		while(writeable)
		{
			try
			{
				wait();
			}
			catch(InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		
		writeable=true;
		notify();
		
		System.err.println(Thread.currentThread().getName()+
		                   "retrieving sharedInt value"+sharedInt);
		return sharedInt;
	}
}
 public class ConsumeInteger extends Thread { private HoldIntegerSynchronized cHold; public ConsumeInteger(HoldIntegerSynchronized h) { super("ConsumeInteger"); cHold=h; } public void run() { int val,sum=0; do { try { Thread.sleep((int)(Math.random()*10000)); } catch(InterruptedException e) { System.err.println(e.toString()); } val=cHold.getSharedInt(); sum+=val; }while(val!=10); System.err.println(getName()+"retrieved values totaling:"+ sum+"\nTerminating "+getName()); } }

 

 

public class ProduceInteger extends Thread
{
	private HoldIntegerSynchronized pHold;
	
	public ProduceInteger(HoldIntegerSynchronized h)
	{
		super("ProduceInteger");
		pHold=h;
	}
	
	public void run()
	{
		for(int count=1;count<=10;count++)
		{
			try
			{
				Thread.sleep((int)(Math.random()*10000));
			}
			catch(InterruptedException e)
			{
				System.err.println(e.toString());
			}
			
			pHold.setSharedInt(count);
		}
		
		System.err.println(getName()+"finished producing values"+
		                   "\nTermininating "+getName());
	}
}

 

 

public class SharedCell 
{
	public static void main(String[] args)
	{
		HoldIntegerSynchronized h=new HoldIntegerSynchronized();
		ProduceInteger p=new ProduceInteger(h);
		ConsumeInteger c=new ConsumeInteger(h);
		
		p.start();
		c.start();
	}	
}

 

 

分享到:
评论

相关推荐

    JAVA实现线程间同步与互斥生产者消费者问题

    在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

    java多线程实现生产者和消费者

    6. **死锁和饥饿**:在设计生产者-消费者模型时,需要注意避免死锁(两个或多个线程相互等待对方释放资源)和饥饿(某个线程因资源分配不当而永远无法执行)。例如,确保生产者不会无限等待消费者消费,消费者也不会...

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

    生产者-消费者问题是多线程同步的一个经典案例,主要探讨如何在并发环境下,确保生产者进程和消费者进程之间正确地共享资源,避免数据竞争和死锁。在这个问题中,生产者进程负责创建产品并将产品放入缓冲区,而消费...

    生产者和消费者模式多线程

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue&lt;String&gt; queue; public Producer(BlockingQueue&lt;String&gt; queue) { this....

    用多线程同步方法解决生产者-消费者问题(操作系统课设

    生产者-消费者问题是操作系统中经典的问题之一,它是指在多线程环境下,多个生产者线程和消费者线程访问同一个共享缓冲区,导致缓冲区的数据混乱和不一致的问题。 在解决生产者-消费者问题时,需要使用同步机制来...

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

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

    12.2 Qt5多线程:使用信号量实现生产者和消费者

    6. **线程间的通信**:在生产者和消费者之间,可能还需要额外的信号和槽(signal and slot)来协调他们的操作,比如当缓冲区满时通知生产者停止生产,或者当缓冲区空时通知消费者暂停消费。 通过以上步骤,我们可以...

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

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

    线程同步生产者消费者问题解析

    总的来说,"线程同步生产者消费者问题"是理解和掌握多线程编程的关键案例。通过这个案例,我们可以深入理解线程间的通信和协作,以及如何有效地使用线程同步机制来管理共享资源。对于开发者来说,掌握这些概念和技巧...

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    线程同步问题:生产者消费者

    通过互斥量、事件来解决生产者和消费者的问题,主要涉及的内容有多线程的创建,事件的创建,互斥量的创建,线程的同步。主要的函数有:CreateThread,CreateEvent,CreateMutex,WaitForMultipleObjects等。

    生产消费者队列(c#),用于线程的队列自动同步

    在多线程编程中,生产者消费者模型是一种常见的设计模式,用于解决线程间的通信和同步问题。在C#中,我们可以利用各种机制实现这样的队列。本篇将详细讲解如何在C#中构建一个生产消费者队列,以及它如何帮助优化线程...

    Java多线程实现生产者消费者

    然后,我们需要创建生产者和消费者线程。每个生产者线程会随机生成产品并调用`produce()`方法,而消费者线程则不断调用`consume()`方法。为了实现多个线程,我们可以使用`Thread`类或者`java.util.concurrent....

    操作系统实验之进程的互斥与同步(生产者与消费者问题)VC++

    另一个是同步信号量,用于控制生产者和消费者的同步。 在VC++环境下,我们可以使用Windows API中的`CreateMutex`和`WaitForSingleObject`等函数来实现互斥,`CreateSemaphore`和`ReleaseSemaphore`函数来实现同步...

    线程同步_生产者消费者问题

    线程同步_生产者消费者问题 经典实现 线程同步_生产者消费者问题

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

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

    多进程同步解决生产者消费者问题(c++源码)

    ### 多进程同步解决生产者消费者问题(C++源码解析) #### 一、问题背景与定义 生产者-消费者问题是一种经典的并发编程问题,它最初由Edsger Dijkstra提出,用来展示信号量机制的应用场景。在这个问题中,存在两类...

    线程同步--生产者消费者问题

    在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...

Global site tag (gtag.js) - Google Analytics