ReentrantLock和Condition实现生产者和消费者
一个生产者和一个消费者
public class ConditionTest { private static ReentrantLock lock = new ReentrantLock(); private static Condition condition = lock.newCondition(); private static int data = ; private static volatile boolean noUse = false; private static void produceData(){
try{
lock.lock();
while (noUse){
condition.await();
}
data++;
System.out.println("produce data "+data);
Thread.sleep();
noUse = true;
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} private static void consumeData(){
try{
lock.lock();
while (!noUse){
condition.await();
}
Thread.sleep();
System.out.println("consume data "+data);
noUse = false;
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
} }
public static void main(String[] args) {
new Thread(() -> {
for (;;){
produceData();
}
}).start(); new Thread(() -> {
for (;;){
consumeData();
}
}).start();
}
}
多个生产者和多个消费者
public class ConditionTest2 { private static Lock lock = new ReentrantLock(); private static Condition PRODUCE_COND = lock.newCondition(); private static Condition CONSUNME_COND = lock.newCondition(); private static LinkedList<String> list = new LinkedList<String>(); private static final int MAX_CAPACITY = ; private static AtomicInteger counter = new AtomicInteger(); private static void produce(){
try{
lock.lock();
while (list.size() >= MAX_CAPACITY){
PRODUCE_COND.await();
}
String value = "data:"+counter.getAndIncrement();
System.out.println(Thread.currentThread().getName()+" produce "+value);
list.addLast(value);
CONSUNME_COND.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} private static void consume(){
try{
lock.lock();
while (list.isEmpty()){
CONSUNME_COND.await();
}
String value = list.removeFirst();
System.out.println(Thread.currentThread().getName()+" consume "+value);
PRODUCE_COND.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} public static void main(String[] args) {
for(int i=; i<; i++){
new Thread(()->{
for(;;){
produce();
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"生产者"+i).start();
} for(int i=; i<; i++){
new Thread(()->{
for(;;){
consume();
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"消费者"+i).start();
} }
}
ReentrantLock和Condition实现生产者和消费者的更多相关文章
- 用ReentrantLock和Condition实现生产者和消费者模式
前面一篇文章<wait.notify应用场景(生产者-消费者模式)>是一种生产者消费者模式实现,今晚这是Lock方式实现,下面是源码: 生产者代码: /** * 生产者 * * @auth ...
- condition版生产者与消费者模式
1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...
- java 线程Thread 技术--1.5Lock 与condition 演示生产者与消费模式
在jdk 1.5 后,Java 引入了lock 锁来替代synchronized ,在使用中,lock锁的使用更加灵活,提供了灵活的 api ,不像传统的synchronized ,一旦进入synch ...
- Lock锁与Condition监视器(生产者与消费者)。
/*生产者与消费者第二次敲,本人表示很郁闷,以后要经常读这个 * Condition 将Object类中的监视器(wait notify notifyAll)分解成不同的对象.例如condition_ ...
- Condition实现一个生产者一个消费者
Condition实现一个生产者一个消费者,实现一对一交替打印: import java.util.concurrent.locks.Condition; import java.util.concu ...
- 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列
简介 多线程通信一直是高频面试考点,有些面试官可能要求现场手写生产者/消费者代码来考察多线程的功底,今天我们以实际生活中母鸡下蛋案例用代码剖析下实现过程.母鸡在鸡窝下蛋了,叫练从鸡窝里把鸡蛋拿出来这个 ...
- JUC 并发编程--02,生产者和消费者 synchronized的写法 , juc的写法. Condition的用法
synchronized的写法 class PCdemo{ public static void main(String[] args) { //多个线程操作同一资源 Data data = new ...
- 多线程-线程间通信-多生产者多消费者问题(JDK1.5后Lock,Condition解决办法及开发中代码范例)
1 package multithread4; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurre ...
- JAVA并发实现五(生产者和消费者模式Condition方式实现)
package com.subject01; import java.util.PriorityQueue; import java.util.concurrent.locks.Condition; ...
随机推荐
- linux内核级同步机制--futex
在面试中关于多线程同步,你必须要思考的问题 一文中,我们知道glibc的pthread_cond_timedwait底层是用linux futex机制实现的. 理想的同步机制应该是没有锁冲突时在用户态 ...
- springcloud分布式事务Atomikos实例
0.JTA(Java Transaction Manager)的介绍 (1)jta与jdbc 简单的说 jta是多库的事务 jdbc是单库的事务 (2)XA与JTA XA : XA是一个规范或是一个事 ...
- MySQL快速入门及常用命令
数据库 笔记内容 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,F ...
- css position 5种不同的值的用法
position属性 position属性指定用于元素的定位方法的类型(静态,相对,固定,绝对或粘性). 有五种不同的值: static relative fixed absolute sticky ...
- mac下chm文件打开乱码解决
菜单栏点击---显示---文本编码(选择编码格式)
- Gradle 创建java程序详细步骤
Java构建工具三强: Ant, Maven, GradleAnt历史悠久, 用build.xml 描述, 当时他的xml着实让很多工程师头痛, 但仍有用武之地. Maven 用pom.xml 文件描 ...
- Python元组与字符串操作(8)——三数排序多种实现
练习 依次接收用户输入的3个数,排序后打印 1.转换int后,判断大小排序,使用分支结构完成 num1 = [] for i in range(3): num1.append(int(input('& ...
- 团队——Alpha2版本发布
这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求的链接 团队名称 杨荣模杰和他的佶祥虎 这个作业的目标 发布并说明产品Alpha2版本 一.团队成员的学号姓名列表 学号 姓名 201731 ...
- JS中的实例方法、静态方法、实例属性、静态属性
一.静态方法与实例方法的例子: 我们先来看一个例子来看一下JS中的静态方法和实例方法到底是什么? 静态方法: function A(){} A.col='red' //静态属性 A.sayMeS=f ...
- 跟着ALEX 学python day3集合 文件操作 函数和函数式编程 内置函数
声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...