`

线程 单生产者单消费者和两种方式

 
阅读更多

 

 

 

1 总结:

 

 

	 * 对于线程死锁,用生产消费者模式|方案来解决, 生活中,人车 共用车道资源也是生产者消费者现象
	 * 生产者消费者模式有两种解决方式:
	 * 1 用容器,容器满了 就停止
	      2 信号灯法,标识位 (这种方式下,必须要 this.wait() + this.notify() + synchronized 才生效)

 

 

1.1 对比 线程 多线程同步加锁说明 中的代码Web12306

这个类中是在真正线程类中的方法上增加锁,同时这个线程类里持有公共资源 tickets,然后多个线程代理类在不停的引用这个真正的线程类并调用真正线程类的方法来消费公共持有的 tickets

 

而2.1中的生产者消费者,是真正线程类中持有共同的业务bean,然后在业务bean的方法中增加锁,然后

类Producer和Consumer共同持有moive这个公共对象类,但是分别调用这个moive类的生产和消费方法。

 

注意区别

 



 

 

 

2.1 信号灯模式代码:

 

 

public class ProduceConsumeThread {

	/**
	 * 对于线程死锁,用生产消费者模式|方案来解决, 生活中,人车 共用车道资源也是生产者消费者现象
	 * 生产者消费者模式有两种解决方式:
	 * 1 用容器,容器满了 就停止
	      2 信号灯法,标识位 (这种方式下,必须要 this.wait() + this.notify() + synchronized 才生效)
	 */
	public static void main(String[] args) {
		Moive moive = new Moive(); // 多线程必须是对同一个对象moive的引用才能会在 moive方法中的 this.wait() this.notify()生效
		new Thread(new Producer(moive),"电影院1").start();// 类Producer和Consumer共同持有moive这个公共对象类,但是分别调用这个moive类的生产和消费方法。
		new Thread(new Consumer(moive),"张三").start();// 而在公共持有类moive的生产和消费这两个方法中,使用信号灯来控制对方的等待和执行
	}
}


class Producer implements Runnable{
	
	private Moive moive;
	
	public Producer() {
		
	}
	
	public Producer(Moive moive) {
		this.moive = moive;
	}

	@Override
	public void run() {
		for(int i=0; i<20; i++) {
			if(i%2 == 0) {
				moive.play("天空电影");
			}else{
				moive.play("草地电影");
			}
		}
	}
	
}


class Consumer implements Runnable{
	
	private Moive moive; // 公共持有类, 此类上持有业务方法
	
	public Consumer() {
		
	}
	
	public Consumer(Moive moive) {
		this.moive = moive;
	}

	@Override
	public void run() {
		for(int i=0; i<20; i++) {
			moive.watch();
		}
	}
	
}



class Moive{
	private String msg ; 
	// flag=true时, 生产者生产,消费者等待,生产完毕后通知消费者
	// flag=false时,生产者等待,消费者消费,消费完毕后通知生产者
	private boolean flag = true; 
	
	// 生产
	public synchronized void play(String msg) {
		if(!flag) {// 等待消费
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		// 开始生产
		try {
			Thread.sleep(1000);// 模拟生产数据的耗时
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() +" 生产了: " + msg);
		this.msg = msg;
		// 通知消费
		this.notify();
		this.flag = false;
	}
	
	
	// 消费
		public synchronized void watch() {
			if(flag) {// 等待生产
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			// 开始消费
			try {
				Thread.sleep(1000);// 模拟消费数据的耗时
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() +"消费了: " + msg);
			// 通知消费
			this.notify();
			this.flag = true;
		}
}

 

  • 大小: 27.5 KB
分享到:
评论

相关推荐

    Win丨linux丨操作系统实验二:生产者——消费者问题

    操作系统实验二:生产者——消费者问题 ...3. 两种环境下,生产者和消费者均作为独立线程,并通过empty、full、mutex三个信号量实现对缓冲进行插入与删除。 4. 通过打印缓冲区中的内容至屏幕,来验证应用程序的正确性。

    操作系统课设-生产者消费者问题.zip

    而本程序正是基于这种思想设计出来的,用来模拟生产者消费者问题的解决过程。 本程序在运行时提供友好的交互界面,且操作简单,在模拟过程中各种情况有相应文字提示,并伴有相应的图像变化,如:当没有产品可消费的...

    Linux下的多线程消费生产模型

    例子中,生产者负责将1到1000的整数写入缓冲区,而消费者负责从同一个缓冲区中读取写入的整数并打印...因为生产者和消费者是两个同时运行的线程,并且要使用同一个缓冲区进行数据交换,因此必须利用一种机制进行同步。

    Linux线程编程之生产者消费者问题

     本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项。文中涉及的代码运行环境如下:  本文假定读者已具备线程同步的基础知识。  一 顺序表循环队列  1.1 ...

    理解生产者消费者模型及在Python编程中的运用实例

    什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产 生数据的模块,就形象地称为...

    threecodes.rar_C语言_pipes_threecodes_父进程 创建 子进程_生产者消费者

    使用linux的Pthread线程库,创建生产者和消费者两个线程,生产者线程计算当前的时间并放入缓冲区,每次计算一个时间数据;消费者线程从缓冲区读出并打印生产者计算的时间,每次打印一个时间数据。缓冲区大小为5个,...

    操作系统:生产者和消费者之吃水果问题

    爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。...这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。

    java实验4.doc

    假设有一个生产者(Producer),一个消费者(Consumer)。生产者产生0~9的整数,将它们存储在盒子(Box)对象中并打印出这些数。消费者从盒子中取出这些整数并将其也打印出来。同时要求生产者产生一个数字,消费者...

    操作系统实验报告.docx

    程序要求能够创建4个进程或线程,其中包括两个生产者和两个消费者,生产者和消费者之间能够传递数据。 3、在Linux环境中采用用户级线程模拟实现EDF和RMS两种实时调度算法。给定一组实时任务,按照EDF算法和RMS算法...

    readerwriterqueue:用于C ++的快速单生产者,单消费者无锁队列

    适用于C ++的单一生产者,单一消费者的无锁队列这个小型存储库具有我自己的C ++无锁队列(我从头开始设计)的实现。 它仅支持两线程用例(一个消费,一个生产)。 线程无法切换角色,尽管您可以根据需要在单个线程中...

    《多线程开发实例代码》

    很基础的多线程开发实例,压缩包里包括了实现多线程的两种方式的Demo:继承 Thread 类和实现 runnable 接口,RunnableDemo为生产者与消费者的实例。

    个人总结的深入java多线程开发

    4)终止多线程程序的两种方式(轮询访问变量和interrupt方法) 23 四Concurrent包详解 25 1)Executor接口 25 2)ExecutorService接口 27 3)Callable对象 28 4)Executors工厂类 29 5)使用ExecutorService的例子 30 6)...

    【操作系统】实现生产者消费者模型

    最近在复习操作系统,随手写两种Java实现生产者消费者模型的方式 一、信号量 import java.util.Queue; import java.util.Random; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent....

    QTcpThreadPoolServiceTest

    试验中,设计了一个设置为CPU核心数的线程池,这个线程池可以异步接受N个数据生产者传入的数据,均衡的分配处理任务,处理后的数据返回给某1个或者几个消费者。有两种均衡方法。 一种是生产者粒度的均衡。同一个...

    深入理解Java线程编程中的阻塞队列容器

    阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法: 抛出异常...

    基于C语言的端口扫描工具设计与实现.zip

    我们采用了Go的携程+生产者消费者模型,让多个生产者发出消息,并同时让多个消费者监听返回,如果收到了对应的返回,则说明端口开放。这样的模型一方面可以实现并行从而加快扫描速度,另一方面使用异步模型,可以...

    联通SGIP1.2短信网关 发送接收短信皆可 可以应对高并发

    实际是接收联通短信中心SMG发过来的信息,为了应对高并发的场景,使用了生产者和消费者典型的多线程设计方案,用线程池去管理多线程,需要改动相关代码,找到类SCIPServer修改即可,接收短信的方式有两种一种是Socket,一种...

    kafka-example:卡夫卡的例子

    多线程生产者由于生产者是线程安全的,因此,更推荐一个生产者实例,多线程引用进行生产的方式。这种方式通常要比每个线程维护一个KafkaProducer实例效率要高。消费者对于KafkaConsumer而言,它不是线程安全的,所以...

    异步通道:异步多生产者多消费者通道

    异步通道 异步多生产者多消费者通道。 渠道有两种: 通道有限,容量有限。 无限容量的无限通道。 通道具有Sender和Receiver方。 双方都是可克隆的,并且可以在多个线程之间共享。 当所有Sender或所有Receiver都被...

    操作系统及软件工程1、 多道程序技术的特点在分页式存储管理中,什么叫快表,说明其工作原理和过程,画出具有快表的地址变换机构。

    3、 生产者-消费者问题的同步算法中,为什么颠倒生产者进程中的两个P操作的次序,将导致进程死锁? 4、 已知某一作业共有4页,其中第0页,第1页,第3页分别装入在内存的第3块,第7块,第5块,而第2页驻外存.在第0页的第...

Global site tag (gtag.js) - Google Analytics