`

146_多线程(线程间通信-生产者消费者)

阅读更多
一个生产者一个消费者
class ProducerConsumer{
	public static void main(String[] args){
		Resource r = new Resource();
		Producer pro = new Producer(r);
		Consumer con = new Consumer(r);
		
		Thread t1 = new Thread(pro);
		Thread t2 = new Thread(con);
		
		t1.start();
		t2.start();
	}
}

class Resource{
	private String name;
	private int count = 1;
	private boolean flag = false;
	
	public synchronized void set(String name){
		if(flag)
			try{wait();}catch(Exception e){}
		this.name = name +"--"+count++;
		System.out.println(Thread.currentThread().getName()+
		"-生产者-"+this.name);
		flag = true;
		this.notify();
	}
	
	public synchronized void out(){
		if(!flag)
			try{wait();}catch(Exception e){}
		System.out.println(Thread.currentThread().getName()+
		"-消费者-"+this.name);
		flag = false;
		this.notify();
	}
}

class Producer implements Runnable{
	private Resource res;
	
	Producer(Resource res){
		this.res = res;
	}
	public void run(){
		while(true){
			res.set("+商品+");
		}
	}
}

class Consumer implements Runnable{
	private Resource res;
	
	Consumer(Resource res){
		this.res = res;
	}
	public void run(){
		while(true){
			res.out();
		}
	}
}

两个生产者两个消费者。改动如下。
class ProducerConsumer{
	public static void main(String[] args){
		Resource r = new Resource();
		Producer pro = new Producer(r);
		Consumer con = new Consumer(r);
		
		Thread t1 = new Thread(pro);
		Thread t2 = new Thread(pro);
		Thread t3 = new Thread(con);
		Thread t4 = new Thread(con);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

运行结果会出现另外两种情况:
1.生产者生成了两次,消费者只取一次
2.生产者生成一次,消费者取两次
发生这两种情况是因为没有判断标记flag。需要将if(flag)改为while(flag)。
但只修改这点,会导致所有进程都处于全部等待状态。所以要把notify()改为notifyAll();
但是改为notifyAll()唤醒的是所有线程,即同时包括生产者和消费者。改进方法见下一篇笔记。
/*
对于多个生产者和消费者
为什么要定义while判断标记?
原因:让被唤醒的线程再进行一次标记判断

为什么定义notifyAll()?
因为需要唤醒对方线程。用notify()容易出现唤醒
本方线程的情况,导致程序中的所有线程都等待。
*/class ProducerConsumer{
	public static void main(String[] args){
		Resource r = new Resource();
		Producer pro = new Producer(r);
		Consumer con = new Consumer(r);
		
		Thread t1 = new Thread(pro);
		Thread t2 = new Thread(pro);
		Thread t3 = new Thread(con);
		Thread t4 = new Thread(con);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

class Resource{
	private String name;
	private int count = 1;
	private boolean flag = false;
	
	public synchronized void set(String name){
		while(flag)
			try{wait();}catch(Exception e){}
		this.name = name +"--"+count++;
		System.out.println(Thread.currentThread().getName()+
		"-生产者-"+this.name);
		flag = true;
		this.notifyAll();
	}
	
	public synchronized void out(){
		while(!flag)
			try{wait();}catch(Exception e){}
		System.out.println(Thread.currentThread().getName()+
		"-消费者-"+this.name);
		flag = false;
		this.notifyAll();
	}
}

class Producer implements Runnable{
	private Resource res;
	
	Producer(Resource res){
		this.res = res;
	}
	public void run(){
		while(true){
			res.set("+商品+");
		}
	}
}

class Consumer implements Runnable{
	private Resource res;
	
	Consumer(Resource res){
		this.res = res;
	}
	public void run(){
		while(true){
			res.out();
		}
	}
}
分享到:
评论

相关推荐

    Java线程间的通信----生产者消费者模型

    在Java编程中,线程间的通信是多线程编程中的一个重要概念,特别是在处理并发和协作任务时。生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来...

    多线程间通信:多生产者-多消费者实例

    在IT领域,多线程间通信是并发编程中的重要概念,尤其在服务器端应用和高并发系统中。本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,...

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

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

    生产者-消费者的Linux多线程实现.pdf

    "生产者-消费者的Linux多线程实现" 生产者-消费者问题简介 生产者-消费者问题是经典的进程同步互斥问题。本文将详细地阐述 Linux 下利用互斥锁、条件变量、线程管理等相关函数实现多线程生产者-消费者问题,以提高...

    解决线程死锁问题的 生产者 消费者程序.rar_linux_linux 线程_生产者_生产者 消费者_生产者消费者

    为了解决生产者-消费者问题,开发者可能会使用互斥锁(mutexes)来保护对缓冲区的访问,使用条件变量(condition variables)来实现线程间的同步。互斥锁确保任何时候只有一个线程能访问缓冲区,而条件变量允许线程...

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

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

    linux下的多线程实例--生产者消费者

    在Linux环境下进行多线程编程时,一个常见的应用场景就是通过生产者消费者模型来管理线程间的通信和数据共享问题。本篇文章将详细解析一个基于Linux环境下的多线程示例程序,该程序通过生产者消费者模型实现数据的...

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

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

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`<thread>`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...

    Java多线程-生产者与消费者问题

    ### Java多线程-生产者与消费者问题 #### 一、生产者与消费者问题概览 **1.1 概要** 生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者...

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

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

    46.线程间的通信-生产者与消费者模式-多生产者与多消费者(操作值).mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    48.线程间的通信-生产者与消费者模式-一生产者多消费者(操作集合).mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java多线程_消费者与生产者模型

    在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...

    学习多线程之一:线程通信--利用事件对象.zip_线程通信

    在多线程编程中,线程通信是一个至关...总之,线程通信是多线程编程中的基础,而事件对象是实现线程间通信的一种有效方式。通过学习和实践,你将能够熟练地在你的程序中应用这些技术,提升多线程程序的效率和可靠性。

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

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

    多线程_生产者与消费者模式示例

    线程池可以配合生产者消费者模式,例如通过提交任务到线程池来实现生产者,线程池中的工作线程充当消费者角色。 在使用生产者消费者模式时,需要注意以下几点: - **线程安全**:确保所有的操作都是线程安全的,...

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

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

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

    生产者-消费者问题是计算机科学中的一个经典问题,主要涉及多线程或多进程同步。这个问题在操作系统课程中常被用来讲解进程间的通信和同步机制。在这个场景中,我们讨论的是在Linux环境下,如何通过多进程的方式解决...

    49.线程间的通信-生产者与消费者模式-多生产者一消费者(操作集合).mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

Global site tag (gtag.js) - Google Analytics