`

简单的生产者与消费者实现

    博客分类:
  • Java
阅读更多

同步堆栈,用于存储。

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.notify();
		data[index] = c;
		index ++;
		System.out.println("Produced:" + c);
	}
	
	public synchronized char pop(){
		while(index == 0){
			try{
				this.wait();
			}catch(InterruptedException e){
			}
		}
		this.notify();
		index--;
		System.out.println("Consume:" + data[index]);
		return data[index];
	}
}

生产者线程:

public class Producer implements Runnable{
	SyncStack stack;
	public Producer(SyncStack stack){
		this.stack = stack;
	}
	public void run(){
		for(int i=0; i<20; i++){
			char c = (char)(Math.random()*26 + 'A');
			stack.push(c);
			try{
				Thread.sleep((int)Math.random()*300);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}

  消费者线程:

public class Consumer implements Runnable{
	private SyncStack stack;

	public Consumer(SyncStack stack){
		this.stack = stack;
	}
	public void run(){
		for(int i=0; i<20; i++){
			char c = stack.pop();
			try{
				Thread.sleep((int)Math.random()*300);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}

    测试:

public class SyncTest {
	public static void main(String args[]){
		SyncStack stack = new SyncStack();
		Runnable p = new Producer(stack);
		Runnable c = new Consumer(stack);
		Thread t1 = new Thread(p);
		Thread t2 = new Thread(c);
		t1.start();
		t2.start();
	}
}
 

wait() 和 notify() 方法的特性决定了它们经常和synchronized 方法或块一起使用,将它们和操作系统的进程间通信机制作 一个比较就会发现它们的相似性:synchronized方法或块提供了类似于操作系统原语的功能,它们的执行不会受到多线程机制的干扰,而这一对方法则 相当于 block 和wakeup 原语(这一对方法均声明为 synchronized)。它们的结合使得我们可以实现操作系统上一系列精妙的进程间 通信的算法(如信号量算法),并用于解决各种复杂的线程间通信问题。

关于 wait() 和 notify() 方法最后再说明两点:

    第一:调用 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。

    第二:除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调 用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。

分享到:
评论

相关推荐

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

    总之,生产者消费者模式是多线程编程中的一种重要设计模式,它通过信号量和条件变量实现了线程间的同步和通信,有效提高了系统资源的利用率和整体效率。在Java中,我们可以借助并发库轻松实现这一模式,使得代码更加...

    生产者与消费者 java实现

    本主题将深入探讨生产者与消费者模型的Java实现。 生产者与消费者问题的核心是有一个共享资源(例如,一个缓冲区),生产者不断地生产产品并放入缓冲区,而消费者则从缓冲区取出产品进行消费。关键在于确保生产者...

    操作系统生产者与消费者问题Java简单模拟实现

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

    生产者消费者的c++代码实现

    "生产者消费者问题C++代码实现" 生产者消费者问题是一个经典的进程同步问题,该问题最早由 Dijkstra 提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品...

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

    在这个实验“进程同步实验——生产者与消费者问题算法实现”中,我们探讨了一个经典的并发问题:生产者-消费者问题。 生产者-消费者问题是多线程编程中的一种典型应用场景,模拟了实际生产流水线的过程。在这个问题...

    LinuxC语言实现生产者和消费者模型

    LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...

    生产者与消费者实验报告

    3. **能够在多线程环境下实现简单的生产者与消费者模型,并对其性能进行分析**。 4. **学会分析和解决在多线程编程中常见的问题,如死锁、饥饿等**。 #### 四、实验环境与工具 - **操作系统**:Windows/Linux/Unix...

    生产者消费者问题,MFC实现

    总之,MFC实现的生产者消费者问题展示了如何在多线程环境下有效管理共享资源,这对于理解和解决并发编程中的挑战非常有帮助。通过实践和学习这样的示例,开发者可以提升在Windows平台下进行多线程编程的能力。

    生产者消费者问题 MFC 实现

    在这个问题中,我们将探讨如何使用MFC来实现生产者消费者模型。 生产者消费者问题是这样设定的:有一组生产者线程负责生成数据(产品),而一组消费者线程则负责消耗这些数据。为了确保数据的正确传递和避免竞争...

    生产者消费者程序的实现

    生产者消费者的实现。可以自主地改变生产者,消费者的数目,和缓冲区。

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

    生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...

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

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    生产者与消费者的设计与实现

    在DOS环境下实现生产者与消费者的挑战主要在于,DOS并不直接支持多线程。因此,可能需要使用如DOS中断(INT 21H)或者第三方库(如DPMI,DOS Protected Mode Interface)来实现类似的功能。例如,通过创建多个进程...

    pv操作解决生产者与消费者问题

    此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...

    C语言编程模拟生产者和消费者问题.pdf

    生产者和消费者问题的解决方案需要使用PV操作来实现同步,以避免生产者和消费者之间的冲突。 实验目的和要求是模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。实验环境是Windows操作系统和...

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

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    C语言实现生产者消费者问题

    C语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...

    OS大作业生产者消费者同步问题的实现

    在某些实现中,信号量可以替代条件变量来实现生产者-消费者同步,但这里并未实际使用。 7. **线程创建与同步**:`pthread_create`函数用于创建新的线程,`pthread_join`用于等待线程结束。在主函数中,分别创建了...

    以记录型信号量实现生产者-消费者问题

    以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...

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

    在Qt5中,我们可以利用QSemaphore类来实现生产者和消费者的同步。QSemaphore提供了一种计数信号量机制,它维护一个非负整数值,允许特定数量的线程访问共享资源。当资源可用时,线程可以获取(acquire)一个许可证,...

Global site tag (gtag.js) - Google Analytics