生产消费锁---信号灯模式

package com.Thread;

public class Custom_Producer {

public static void main(String[] args) {

//共享资源

Production pro = new Production();

Custom custom = new Custom(pro);

Producer producer = new Producer(pro);

new Thread(producer).start();

new Thread(custom).start();

}

}

//资源

class Production {

private String src ;

/**

* 信号

* flag ---> true  生产,消费等待, 生产完成,通知消费

* flag ---> false  消费,生产等待,  消费完成,通知生产

*/

private boolean flag = true;

public synchronized void product(String src) throws Exception{

if(!flag ) {// false 生产等待

this.wait();

}

//开始生产

Thread. sleep(500);

//生产完毕

this.src = src;

System. out.println("生产了----------->" + src);

//通知消费

this.notify();

//停止生产

this.flag = false;

}

public synchronized void custom() throws Exception {

if(flag ) {// true 消费等待

this.wait();

}

//开始消费

System. out.println("消费了---" +src );

//消费完毕

//通知生产

this.notifyAll();

//停止消费

this.flag = true;

}

}

//生产

class Producer implements Runnable {

Production p ;

public Producer(Production p) {

this.p = p;

}

@Override

public void run() {

for(int i=0; i<20; i++) {

if(0==i%2) {

try {

p.product( "奇数====生产了" + i +" 个");

catch (Exception e) {

e.printStackTrace();

}

else {

try {

p.product( "偶数====生产了" + i +" 个");

catch (Exception e) {

e.printStackTrace();

}

}

}

}

}

//消费

class Custom implements Runnable {

Production p ;

public Custom(Production p) {

this.p = p;

}

@Override

public void run() {

for(int i=0; i<20; i++) {

try {

p.custom();

catch (Exception e) {

e.printStackTrace();

}

}

}

}

时间: 2024-11-08 21:49:27

生产消费锁---信号灯模式的相关文章

3、传统线程同步与通信--生产消费例子

核心点: 1.锁对象必须是同一个. 2.wait()和notify()方法必须是调用锁对象的方法,而非this(线程)的. 3.在多生产多消费的时候注意使用notifyAll而不是notifyAll,否则会造成死锁 测试代码: 1 import java.util.LinkedList; 2 import java.util.Queue; 3 import java.util.Random; 4 5 /** 6 * 多个生产 - 消费 线程同步通信 7 * 核心点: 8 * 1.锁对象必须是同一

【JAVA】wait和notify用法,附生产/消费模型

关于wait和notify的用法,网上已经有很多详细解释了,我只是简单的总结下. wait用于释放锁A,并让wait所在的线程阻塞.除非被持有锁A的其它线程执行notify来唤醒,它才能重新"活"过来. notify用于唤醒因为等待锁A而阻塞的线程,让它们做好竞争锁A的准备.如果有多个线程因等待锁A而被阻塞,notify只唤醒一个,唤醒所有用notifyAll. 参考下面的线程状态图,对理解wait和notify有很大的帮助. 总结: wait和notify通常和synchronize

Java生产消费模型—ArrayBlockingQueue详解

背景需求 生产消费模型是线程协作关系中十分常见的一种.通常,一个(多个)线程负责生产,一个(多个)线程可以从生产的列表中获取并消费:生产的内容可以按需求设计,可以是一个Integer,可以是String,可以Object,也可以是任意类型的对象,只要有生产消费的需求. 例如,厨师负责生产美食,放在桌子上,服务员负责取走(消费)美食.这里,厨师就扮演着生产者的身份,美食是生产的内容,服务员就扮演着消费者的身份. 下面用这个厨师与服务员的案例来分析下生产消费模型需要实现哪些功能才能满足需求: 如何实

VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启)

VopSdk一个高逼格微信公众号开发SDK(源码下载) VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启) 针对第一版,我们搞了第二版本,老规矩先定个目标. 一 我们的目标 a.移除PayExcute,统一执行入口,目前只保留一个入口Excute b.序列化特性统一,目前只用设置xml特性即可(反序列化时xml和json都可以直接用) c.支持文件上传,目前只有多客服管理上传头像接口用到过 d.使用T4模板自动生产所有Request.Response.以及所有测试Test(装

InnoDB中锁的模式,锁的查看,算法

Ⅰ.总览 S行级共享锁lock in share mode X行级排它锁增删改 IS意向共享锁 IX意向排他锁 AI自增锁 Ⅱ.锁之间的兼容性 兼 X IX S IS X × × × × IX × √ × √ S × × √ √ IS × √ √ √ 2.1 意向锁 意向锁揭示了下一层级请求的锁类型,意向锁全兼容 IS:事务想要获得一张表中某几行的共享锁 IX:事务想要获得一张表中某几行的排它锁 InnoDB存储引擎中意向锁都是表锁,是不是读下来很懵逼? 如果没有意向锁,当你去锁一张表的时候,你

【并发】9、借助redis 实现生产消费,消息订阅发布模式队列

这个就是一个消息可以被多次消费的范例了 其实这个实现的方式可以参考我之前的设计模式,观察者模式 https://www.cnblogs.com/cutter-point/p/5249780.html 不过有一点需要注意一下啊,这个消息发布的时候,好像是不支持字节数据的,里面好像会对字节进行转换,这样的结果就是导致我最后无法吧相应的字节转换成我之前序列化的对象 不知道是不是ObjectInputStream和ObjectOutputStream实现不是很好的原因,还是什么,反正反序列化的时候,有些

Day9 进程同步锁 进程队列 进程池 生产消费模型

进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. 1 from multiprocessing import Process,Lock #引用函数 2 import time 3 def work(name,mutex): 4 mutex.acquire() #在这里加入锁 5 print('task <%s> is runing' %name) 6

并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁

一.守护进程 二.互斥锁 三.抢票 四.进程间通讯 五.进程间通讯2 一.守护进程 """ 进程间通讯的另一种方式 使用queue queue 队列 队列的特点: 先进的先出 后进后出 就像扶梯 """ from multiprocessing import Process,Queue # 基础操作 必须要掌握的 # 创建一个队列 # q = Queue() # # 存入数据 # q.put("hello") # q.put(

GCD 实现生产-消费 模式

#import "ViewController.h" @interface ViewController (){ } @property (nonatomic,strong) dispatch_semaphore_t sema; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view,