Condition实现一个生产者一个消费者
Condition实现一个生产者一个消费者,实现一对一交替打印:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* 生产消费逻辑
*/
public class MyService { private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private boolean hasValue = false; public void set() {
try {
lock.lock();
while (hasValue) {
condition.await();
}
System.out.println("☆");
hasValue = true;
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
} public void get() {
try {
lock.lock();
while(!hasValue) {
condition.await();
}
System.out.println("★");
hasValue = false;
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
/**
* 生产者线程
*/
public class MyThreadA extends Thread{
private MyService service; public MyThreadA(MyService service) {
this.service = service;
} @Override
public void run() {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
service.set();
}
}
}
/**
* 消费者线程
*/
public class MyThreadB extends Thread{
private MyService service; public MyThreadB(MyService service) {
this.service = service;
} @Override
public void run() {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
service.get();
}
}
}
/**
* 交替打印测试类
*/
public class Run { public static void main(String[] args) {
MyService service = new MyService(); MyThreadA a = new MyThreadA(service);
a.start();
MyThreadB b = new MyThreadB(service);
b.start();
}
}
运行结果如下:

Condition实现一个生产者一个消费者的更多相关文章
- 【爬虫】Condition版的生产者和消费者模式
Condition版的生产者和消费者模式 threading.Condition 在没有数据的时候处于阻塞状态,有数据可以使用notify的函数通知等等待状态的线程运作 threading.Condi ...
- Lock锁与Condition监视器(生产者与消费者)。
/*生产者与消费者第二次敲,本人表示很郁闷,以后要经常读这个 * Condition 将Object类中的监视器(wait notify notifyAll)分解成不同的对象.例如condition_ ...
- 浅谈Java简单实现的生产者与消费者问题
一.面对生产者和消费者的问题,首先我们得明白几点: 生产者:生产数据:消费者:消费数据.消费者在没有数据可供消费的情况下,不能消费:生产者在原数据没有被消费掉的情况下,不能生产新数据.假设,数据空间只 ...
- 生产者与消费者-1:1-基于list
一个生产者/一个消费者: /** * 生产者 */ public class P { private MyStack stack; public P(MyStack stack) { this.sta ...
- Linux组件封装(五)一个生产者消费者问题示例
生产者消费者问题是计算机中一类重要的模型,主要描述的是:生产者往缓冲区中放入产品.消费者取走产品.生产者和消费者指的可以是线程也可以是进程. 生产者消费者问题的难点在于: 为了缓冲区数据的安全性,一次 ...
- 用阻塞队列实现一个生产者消费者模型?synchronized和lock有什么区别?
多线程当中的阻塞队列 主要实现类有 ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序 LinkedBlockingQueue是一个基于链表结构的 ...
- 一个经典的消费者和生产者的实现(linux )
#include <stdio.h> #include <pthread.h> #define BUFFER_SIZE 16 // 缓冲区数量 struct ...
- 对生产者和消费者问题的另一个解决办法是使用QWaitCondition(封装好了wakeOne,wakeAll,而且与QReadWriteLock对接,几乎是万能的办法)
对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程.其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件 ...
- java使用lock实现一个简单的生产者和消费者模式
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public ...
随机推荐
- Spring_总结_03_装配Bean(三)_XML配置
一.前言 本文承接上一节:Spring_总结_03_装配Bean(二)之Java配置 上一节说到,当需要显示配置时,首选类型安全并且比XML更强大Java配置. 那什么时候使用XML配置呢? (1)维 ...
- codeforces D. Area of Two Circles' Intersection 计算几何
D. Area of Two Circles' Intersection time limit per test 2 seconds memory limit per test 256 megabyt ...
- 进程、线程、ThreadLlocal
1.线程是最小的执行单位,而进程中至少一个线程组:如果调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间 Unix/Linux操作系统提供了一个fork()系统调用,它非常 ...
- C中的时间函数的用法
C中的时间函数的用法 这个类展示了C语言中的时间函数的常用的用法. 源代码: #include <ctime>#include <iostream> using name ...
- hl7 V2中Message Control ID的含义及应用
HL7 v2中的MSH,MSA段都有Message Control ID. 有几点需要注意: 1.所有的MessageControlID必须唯一 2.对于MSH中的MessageControlID, ...
- java服务覆盖率统计 jacoco ant
● 下载jacoco.exec.jacocoant.jar.jacocoagent.jar ● jvm启动参数中添加(tomcat服务原理一样) JACOCO_OPTS=JAVA_OPTS=" ...
- Mstar 编译器的搭建
机顶盒: 1.解压“mipsisa32-elf-3.4.4-20101123.i386linux.tar.gz" 应用编译器 2.mips-4.3-51-mips-linux-gnu-i68 ...
- 蓝桥杯 算法训练 ALGO-152 8-2求完数
算法训练 8-2求完数 时间限制:50.0s 内存限制:256.0MB 问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例 ...
- HDOJ4768(二分区间)
Flyer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- struts2获得需要的文件或者访问路径
在struts2中,上传文件的时候遇到一个很好用但是失效的方法,找到如下替代.并且测试了一下request可以得到的相关路径. 得到request对象: HttpServletRequest requ ...