`
yan_qinglong
  • 浏览: 4122 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
社区版块
存档分类
最新评论

多线程下生产者与消费者的问题

 
阅读更多
package com.yql.thread;

//生产者与消费者问题java代码实现
public class ProducerConsumer {
	public static void main(String[] args) {
		//创建一个栈用来放窝头
		SyncStack ss = new SyncStack();
		//生产者p
		Producer p = new Producer(ss);
		//消费者c
		Consumer c = new Consumer(ss);
		//开启生产者消费者线程各两个,模拟两个买窝头两个生产窝头
		new Thread(p).start();
		new Thread(p).start();
		new Thread(p).start();
		new Thread(c).start();
	}
}
//窝头类
class WoTou {
	int id; 
	WoTou(int id) {
		this.id = id;
	}
	public String toString() {
		return "WoTou : " + id;
	}
}
//用来装窝头的栈
class SyncStack {
	int index = 0;
	//最多容纳6个窝头
	WoTou[] arrWT = new WoTou[6];
	//同步出栈的方法
	public synchronized void push(WoTou wt) {
		//只要窝头满栈了就让该线程wait等待其他方法唤醒
		while(index == arrWT.length) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//唤醒其他等待该同步锁的所有线程
		this.notifyAll();		
		arrWT[index] = wt;
		index ++;
	}
	//同步进栈的方法
	public synchronized WoTou pop() {
		//一旦窝头栈空了就让该线程wait等待其他方法唤醒
		while(index == 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//唤醒其他等待该同步锁的所有对象
		this.notifyAll();
		index--;
		return arrWT[index];
	}
}
//生产者 实现了runnable接口 可以用于多线程
class Producer implements Runnable {
	SyncStack ss = null;
	Producer(SyncStack ss) {
		this.ss = ss;
	}
	//模拟生产20个窝头,每生产一个就将其放入到窝头栈中
	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = new WoTou(i);
			ss.push(wt);
            System.out.println("生产了:" + wt);
			try {
				Thread.sleep((int)(Math.random() * 200));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}
}
//消费者
class Consumer implements Runnable {
	SyncStack ss = null;
	Consumer(SyncStack ss) {
		this.ss = ss;
	}
	//模拟消费20个窝头
	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = ss.pop();
            System.out.println("消费了: " + wt);
			try {
				Thread.sleep((int)(Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}
}

 

分享到:
评论

相关推荐

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

    9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...

    多线程解决生产者与消费者问题

    本文通过多线程方法解决了生产者与消费者之间同步的问题

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

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

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

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

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

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

    Linux c语言多线程实现生产者/消费者问题

    以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...

    java多线程(生产者与消费者)

    6. **死锁与活锁**:在实现生产者消费者模式时,需要警惕死锁和活锁的情况。死锁是指两个或多个线程相互等待对方释放资源,导致无法继续执行。活锁则是线程不断地尝试获取资源但总是失败,从而陷入无限循环。正确的...

    多线程讲生产者与消费者

    多线程生产者与消费者,,生产者和消费者的解答网络上有多种线程版本,但却没看到进程版本,所以我就来填补这一“空白”了。PS:使用进程版本的另一个重要原因是,想顺便复习下共享内存。 我们使用信号量来同步,用...

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

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

    java多线程经典模型生产者消费者

    java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...

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

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

    c#多线程之生产者消费者

    "生产者消费者"模式是多线程应用中一个经典的范例,它通过线程间的协作来实现数据处理的高效与同步。这个模式的核心思想是将任务分为两个角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据,而消费...

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

    使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...

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

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

    多线程实例,关于生产者与消费者的问题

    "生产者-消费者问题"是多线程编程中一个经典的同步问题,它涉及到资源的共享和线程间的协作。这个问题的核心在于如何有效地协调生产者线程(负责生产数据)和消费者线程(负责消费数据),使得生产与消费的过程既...

    操作系统实验 多线程 生产者消费者问题

    操作系统实验中的多线程生产者消费者问题是经典的并发编程模型,它展示了如何在多个线程间共享资源并协调它们的工作。这个模型通常用于演示线程同步和互斥的概念,是理解和学习操作系统内核级并发控制机制的重要实践...

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

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

    Linux 多线程实现生产者消费者模式.pdf

    总结来说,Linux多线程实现生产者消费者模式涵盖了多线程创建、线程同步与互斥、锁机制、条件变量以及线程屏障等核心知识点。这些知识点是Linux下进行高级多线程编程不可或缺的部分,对于理解现代操作系统中多任务...

    java多线程实现生产者消费者问题

    用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题

    多线程实现生产者消费者

    8. **死锁和饥饿**:在实现多线程生产者消费者模型时,必须警惕可能出现的死锁和饥饿问题。死锁是两个或更多线程相互等待对方释放资源导致的僵局,而饥饿则是指某一线程因为资源分配不公平而无法获得执行的机会。...

Global site tag (gtag.js) - Google Analytics