Java 多线程之生产者消费者(多个生成者多个消费者)synchronized 和lock多线程通讯和同步实现
public class ProducterConsumerSample {
public static void main(String[] args) {
Resourse res = new Resourse();
//两个生产者
Producter producter1 = new Producter(res);
Producter producter2 = new Producter(res);
//三个消费者
Consumer consumer1 = new Consumer(res);
Consumer consumer2 = new Consumer(res);
Consumer consumer3 = new Consumer(res);
Thread t1 = new Thread(producter1);
Thread t2 = new Thread(producter2);
Thread t3 = new Thread(consumer1);
Thread t4 = new Thread(consumer2);
Thread t5 = new Thread(consumer3);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
/**
* 显示如下
* Thread-1 生产者 ++ 苹果手机---1
* Thread-2 消费者 苹果手机---1
* Thread-0 生产者 ++ 苹果手机---2
* Thread-2 消费者 苹果手机---2
* Thread-0 生产者 ++ 苹果手机---3
* Thread-2 消费者 苹果手机---3
* Thread-0 生产者 ++ 苹果手机---4
* Thread-2 消费者 苹果手机---4
* Thread-0 生产者 ++ 苹果手机---5
* Thread-2 消费者 苹果手机---5
* Thread-0 生产者 ++ 苹果手机---6
* Thread-2 消费者 苹果手机---6
* Thread-0 生产者 ++ 苹果手机---7
* Thread-2 消费者 苹果手机---7
* Thread-0 生产者 ++ 苹果手机---8
* Thread-2 消费者 苹果手机---8
* Thread-0 生产者 ++ 苹果手机---9
* Thread-2 消费者 苹果手机---9
* Thread-0 生产者 ++ 苹果手机---10
* Thread-2 消费者 苹果手机---10
*/
}
}
class Resourse {
private int productId = 1;
private String productName;
private boolean flag = false;
/**
* 同步函数,解决多线程操作时的安全问题
*/
public synchronized void product(String productName) {
while (flag) { //关键点 此处一定要用while循环
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.productName = productName + "---" + productId++;
System.out.println(Thread.currentThread().getName() + " 生产者 ++ " + this.productName);
flag = true;
this.notifyAll(); //关键点 此处一定要把所有wait线程全部唤醒
}
/**
* 同步函数,解决多线程操作时的安全问题
*/
public synchronized void consume() {
while (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 消费者 " + this.productName);
flag = false;
this.notifyAll();
}
}
class Producter implements Runnable {
private Resourse res;
Producter(Resourse res) {
this.res = res;
}
@Override
public void run() {
while (true) {
res.product("苹果手机");
}
}
}
class Consumer implements Runnable {
private Resourse res;
Consumer(Resourse res) {
this.res = res;
}
@Override
public void run() {
while (true) {
res.consume();
}
}
}
import java.io.PrintStream;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* 使用lock实现多线程之间的数据通讯和同步
*/
public class ProducterConsumerSample {
public static void main(String[] args) {
Resourse res = new Resourse();
//两个生产者
Producter producter1 = new Producter(res);
Producter producter2 = new Producter(res);
//三个消费者
Consumer consumer1 = new Consumer(res);
Consumer consumer2 = new Consumer(res);
Consumer consumer3 = new Consumer(res); Thread t1 = new Thread(producter1);
Thread t2 = new Thread(producter2);
Thread t3 = new Thread(consumer1);
Thread t4 = new Thread(consumer2);
Thread t5 = new Thread(consumer3);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
/**
* 显示如下
* Thread-1 生产者 ++ 苹果手机---105851
* Thread-4 消费者 苹果手机---105851
* Thread-0 生产者 ++ 苹果手机---105852
* Thread-2 消费者 苹果手机---105852
* Thread-1 生产者 ++ 苹果手机---105853
* Thread-3 消费者 苹果手机---105853
* Thread-0 生产者 ++ 苹果手机---105854
* Thread-4 消费者 苹果手机---105854
* Thread-1 生产者 ++ 苹果手机---105855
* Thread-2 消费者 苹果手机---105855
* Thread-0 生产者 ++ 苹果手机---105856
* Thread-3 消费者 苹果手机---105856
*/
}
} class Resourse {
private int productId = 1;
private String productName;
private boolean flag = false;
private final Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition(); //生产者Condition
private Condition condition_Cons = lock.newCondition(); //消费者Condition public void product(String productName) {
lock.lock(); //加锁
try {
while (flag) { //关键点 此处一定要用while循环
try {
condition_pro.await(); //生产者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.productName = productName + "---" + productId++;
System.out.println(Thread.currentThread().getName() + " 生产者 ++ " + this.productName);
flag = true;
condition_Cons.signal(); //唤醒消费者
} finally {
lock.unlock(); //解锁
}
} public void consume() {
lock.lock(); //加锁
try {
while (!flag) {
try {
condition_Cons.await(); //消费者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 消费者 " + this.productName);
flag = false;
condition_pro.signal(); //唤醒生产者
} finally {
lock.unlock(); //解锁
}
}
} class Producter implements Runnable { private Resourse res; Producter(Resourse res) {
this.res = res;
} @Override
public void run() {
while (true) {
res.product("苹果手机");
}
}
} class Consumer implements Runnable { private Resourse res; Consumer(Resourse res) {
this.res = res;
} @Override
public void run() {
while (true) {
res.consume();
}
}
}
Java 多线程之生产者消费者(多个生成者多个消费者)synchronized 和lock多线程通讯和同步实现的更多相关文章
- Java并发编程:synchronized、Lock、ReentrantLock以及ReadWriteLock的那些事儿
目录 前言 synchronized用法 修饰方法 修饰实例方法 修饰静态方法 同步代码块 引出Lock Lock用法 子类:ReentrantLock 读写分离锁:ReadWriteLock Loc ...
- 【多线程】java多线程实现生产者消费者模式
思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- java学习多线程之生产者消费者
在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系.那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三.李四负责生产烤鸭,王五.马六负责吃烤鸭,那么前者生产完烤 ...
- Java多线程实现生产者消费者延伸问题
在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存. 这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题. 题目 ...
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
JAVA之旅(十五)--多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止 我们接着多线程讲 一.生产者和消费者 什么是生产者和消费者?我们 ...
- Java多线程之生产者消费者问题<一>:使用synchronized keyword解决生产者消费者问题
今天看了一片博文,讲Java多线程之线程的协作,当中作者用程序实例说明了生产者和消费者问题,但我及其它读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的样例也都存在bug,经过细致研究发现当中的问 ...
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...
- JAVA多线程之生产者 消费者模式 妈妈做面包案例
创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包 最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...
随机推荐
- 1 集群状态、增删改查、全量替换、强制创建、设置单个index的分片数副本数
检查集群健康状态,可以看集群颜色.(黄色:primary shard都正常,replica不正常) GET /_cat/health?v 列出集群所有index GET /_cat/indices?v ...
- H5调起IOS原生商店支付
参考文档:http://www.html5plus.org/doc/zh_cn/payment.html 申请内购项目摘自 https://www.jianshu.com/p/1e79bfbe46e2 ...
- FreeRTOS二值信号量
API函数 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xSemaphoreCreateBinary() xQueueGenericCre ...
- net 与或非
&& op1 && op2 当op1和op2都是true时,返回true :如果op1的值是false,则不运算右边的操作数 || op1 || op2 当op1和op ...
- JAVA命名规范性总结
一:命名规范 1.项目名全部小写2.包名全部小写 在新建一个包项目时可能会涉及到多层设计,每层的包名要遵循包名全部小写的规范,如图在一个功能的逐层上级的包名全部是小写的字符组成3.类名的命名要遵循首字 ...
- css定位基础知识
标题:css定位 地址:https://www.w3school.com.cn/css/css_positioning.asp
- 利用webhook实现发送通知到Slack
概要 最近办公交流应用 Slack在各团队里大行其道,非常火热. 今天我们就来说说怎么用他的incoming-webhook来做一些同步通知. 从kintone发送通知给Slack 我们先来看看这种i ...
- 爬虫(二)-创建项目&应用
一.回顾 上篇已经讲解了python-django的环境搭建,本次将继续上次的课程,开始创建项目及应用. 上篇的验证结果为: 本次将加上创建应用之后浏览器打开演示~ 二.创建项目 1)使用django ...
- spark context stop use with as
调用方法: with session.SparkStreamingSession('CC_Traffic_Realtime', ssc_time_windown) as ss_session: kaf ...
- 《你说对就队》第九次团队作业:Beta冲刺与验收准备
<你说对就队>第九次团队作业:Beta冲刺与验收准备 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...