`

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

阅读更多

1、实现一个生产者

       

public class Producer implements Runnable {

	SyncStack stack;	//数据存放位置,和生产者是相同的位置

	public Producer(SyncStack s){
		stack = s;
	}
	public void run(){
		for(int i=0; i<20; i++){
			char c =(char)(Math.random()*26+'A');
			stack.push(c);//产品生产后,存放产品
			System.out.println("produced:"+c);
			try{							        
				Thread.sleep((int)(Math.random()*1000)); 
			}catch(InterruptedException e){
			}
		}
	}
}

 

2、实现消费者

   

public class Consumer implements Runnable {
	SyncStack stack;	//数据存放位置,和生产者是相同的位置
	public Consumer(SyncStack s){
		stack = s;
	}
	public void run(){
		for(int i=0;i<60;i++){
			char c = stack.pop();//往外拿产品,进行产品消费
			System.out.println("消费:"+c);
			try{							           
				Thread.sleep((int)(Math.random()*1000));
			}catch(InterruptedException e){
			}
		}
	}

}

 3、实现存放位置的线程同步

 

public class SyncStack {
	private int index = 0;
	private char []data = new char[6];	
	public synchronized void push(char c){
		while(index == data.length){
		try{
				this.wait();
				//某线程执行到这里时,篮子已经满了,那么就等待消费者消费。此时锁已经不再属于该线程
				
		}catch(InterruptedException e){}
		}
		this.notifyAll();//唤醒其他线程(消费者线程或者其他生产者线程)
		                     //主要是为了让消费者消费,才能唤醒其他等待的生产者线程
		                 
		data[index] = c;
		index++;
	}
	public synchronized char pop(){
		while(index ==0){
			try{
				this.wait();
				//某线程执行到这里时,篮子已经空了,那么就等待生产者生产,此时锁已经不属于该线程
				
			}catch(InterruptedException e){}
		}
		this.notifyAll();//唤醒其他线程(生产者线程或者其他消费这线程)
		                 //主要是为了让生产者生产,才能唤醒其它等待的消费者线程
		index--;           
		return data[index];
	}
}

 

5、测试类

    

public class ProducerConsumer {
	 public static void main(String args[]){
		  SyncStack stack = new SyncStack();//共享存储空间
		 Producer p=new Producer(stack);
		  Consumer c = new Consumer(stack);
	                  new Thread(p).start();//生产者线程
		 new Thread(p).start();//生产者线程
		 new Thread(p).start();//生产者线程
		 new Thread(c).start();//消费者线程
 }
}

 

 

分享到:
评论

相关推荐

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

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

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

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

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

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

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

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

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

    多线程同步方法解决生产者-消费者问题 多线程同步方法是解决生产者-消费者问题的常用方法。生产者-消费者问题是操作系统中经典的问题之一,它是指在多线程环境下,多个生产者线程和消费者线程访问同一个共享缓冲区...

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

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

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

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

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

    在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...

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

    生产者-消费者问题是并发编程中的一个经典模型,它描述了两个或多个线程之间的协作,其中一个或多个线程(生产者)负责生成数据,而其他线程(消费者)则负责处理这些数据。在实际应用中,这可以对应于例如数据生成...

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

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

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

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

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

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

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

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

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

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

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

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

    进程同步实验——生产者与消费者问题算法实现

    通过运行这些程序,我们可以观察不同配置下的系统行为,理解生产者和消费者之间的竞争条件以及同步机制如何解决这些问题。 在报告文档“操作系统原理实验报告.doc”中,可能包含了对实验设计、实现过程、结果分析...

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

    在生产者与消费者问题中,同步的目的是确保生产者不会在缓冲区满时继续生产,而消费者也不会在缓冲区空时尝试消费。这通常通过信号量机制来实现。 **生产者与消费者问题**是经典的多进程同步问题。在这个问题中,...

    进程同步模拟设计--生产者和消费者问题

    总结来说,进程同步模拟设计——生产者和消费者问题是一个典型的多线程同步问题,通过使用信号量等同步机制,我们可以实现并发进程间的有效协作,保证数据的一致性和系统的正常运行。在实际编程中,理解并熟练运用...

Global site tag (gtag.js) - Google Analytics