并发编程-Condition
Condition
一个Lock中应该绑定一个Condition对象。Condition是Java提供用来实现等待/通知的类。
我们知道Object对象提供了wait、waitAll、notify、notifyAll的方法用来实现线程的同步、等待和唤醒。
但Condition类提供了比wait/notify更丰富的功能,Condition对象由lock对象所创建的,同时一个Lock可以创建多个Condition对象,即创建多个对象监听器,这样就可以指定唤醒具体线程,而notify是随机唤醒线程。
Condition接口
- void await():造成当前线程在接到信号或被中断之前一直处于等待状态。
 - boolean await(long time, TimeUnit unit):造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
 - long awaitNanos(long nanosTimeout):造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
 - void awaitUninterruptibly():造成当前线程在接到信号之前一直处于等待状态。
 - boolean awaitUntil(Date deadline):造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。
 - void signal():唤醒一个等待线程。
 
范例
public class Resource {
    private final int MAX_SIZE = 10;
    private List<Object> list = Lists.newArrayList();
    private Lock lock = new ReentrantLock();
    private Condition produceCondition = lock.newCondition();
    private Condition consumerCondition = lock.newCondition();
    public void produce() {
        while (true) {
            lock.lock();
            try {
                while (list.size() == MAX_SIZE) {
                    System.out.println("生产满了,暂时无法生产:" + list.size());
                    consumerCondition.signal();
                    try {
                        produceCondition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                list.add(new Object());
                System.out.println(Thread.currentThread().getName() + "生产新产品,共有:" + list.size());
            } finally {
                lock.unlock();
            }
        }
    }
    public void consume() {
        while (true) {
            lock.lock();
            try {
                while (CollectionUtils.isEmpty(list)) {
                    System.out.println("没有物品了,需要生产了");
                    produceCondition.signal();
                    try {
                        consumerCondition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + "消费产品,共有:" + list.size());
                list.remove(0);
            } finally {
                lock.unlock();
            }
        }
    }
}
生产者线程
public class ProduceThread implements Runnable {
    private Resource resource;
    public ProduceThread(Resource resource){
        this.resource = resource;
    }
    @Override
    public void run() {
        resource.produce();
    }
}
消费者线程
public class ConsumerThread implements Runnable {
    private Resource resource;
    public ConsumerThread(Resource resource){
        this.resource = resource;
    }
    @Override
    public void run() {
        resource.consume();
    }
}
测试案例
public class ConditionDemo {
    public static void main(String[] args) throws InterruptedException {
        Resource resource = new Resource();
        ProduceThread produceThread = new ProduceThread(resource);
        ConsumerThread consumerThread = new ConsumerThread(resource);
        // 4个生产者
        for (int i = 0; i < 4; i++) {
            new Thread(produceThread).start();
            new Thread(consumerThread).start();
        }
    }
}
												
											并发编程-Condition的更多相关文章
- JAVA并发编程--Condition
		
Condition主要是为了在J.U.C框架中提供和Java传统的监视器风格的wait,notify和notifyAll方法类似的功能. AQS等待队列与Condition队列是两个相互独立的队列 a ...
 - Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
		
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
 - 并发编程实践三:Condition
		
Condition实例始终被绑定到一个锁(Lock)上.Lock替代了Java的synchronized方法,而Condition则替代了Object的监视器方法,包含wait.notify和noti ...
 - java并发编程——通过ReentrantLock,Condition实现银行存取款
		
java.util.concurrent.locks包为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器.该框架允许更灵活地使用锁和条件,但以更难用的语法为代价. Lock 接口 ...
 - 并发编程(六)——AbstractQueuedSynchronizer 之 Condition 源码分析
		
我们接着上一篇文章继续,本文讲讲解ReentrantLock 公平锁和非公平锁的区别,深入分析 AbstractQueuedSynchronizer 中的 ConditionObject 公平锁和非公 ...
 - Java并发编程原理与实战二十二:Condition的使用
		
Condition的使用 Condition用于实现条件锁,可以唤醒指定的阻塞线程.下面来实现一个多线程顺序打印a,b,c的例子. 先来看用wait和notify的实现: public class D ...
 - 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
		
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
 - 006 Java并发编程wait、notify、notifyAll和Condition
		
原文https://www.cnblogs.com/dolphin0520/p/3920385.html#4182690 Java并发编程:线程间协作的两种方式:wait.notify.notifyA ...
 - 二十三、并发编程之深入解析Condition源码
		
二十三.并发编程之深入解析Condition源码 一.Condition简介 1.Object的wait和notify/notifyAll方法与Condition区别 任何一个java对象都继承于 ...
 
随机推荐
- 在nginx配置将请求转发到某个真实后端服务ip
			
一.打开nginx机器的nginx配置文件 命令: locate nginx.conf 会列出所有nginx.conf文件的地址, 一般咱们要用的nginx配置文件是/usr/local/nginx/ ...
 - 1113 Integer Set Partition
			
Given a set of N (>) positive integers, you are supposed to partition them into two disjoint sets ...
 - ASP微信服务号H5客户登陆,且获取客户授权的用户基本信息
			
ASP微信服务号H5客户登陆,且获取客户授权的用户基本信息是需要客户授权,下面讲解详细步骤: 第一步:客户点击登录页,自动跳转到微信服务器端获取code 第二步:用第一步获取的code去获取客户的ac ...
 - 09- Linux下压缩和解压命令
			
压缩和解压命令 gzip命令: 作用: tar命令 作用:对文件或文件夹进行打包和解包的操作. 格式:tar [选项] 文件名 [文件名或路径] 练习题:
 - Python爬虫之 正则表达式和re模块
			
什么是正则表达式: 通俗理解:按照一定的规则,从某个字符串中匹配出想要的数据.这个规则就是正则表达式.标准答案:https://baike.baidu.com/item/正则表达式/1700215?f ...
 - Win64 驱动内核编程-14.回调监控文件
			
回调监控文件 使用 ObRegisterCallbacks 实现保护进程,其实稍微 PATCH 下内核,这个函数还能实现文件操作监视.但可惜只能在 WIN7X64 上用.因为在 WIN7X64 上 P ...
 - JavaScript中DOM与BOM的区别
			
1.BOM BOM全称为Brower Object Model,中文翻译为浏览器对象模型,提供了独立于内容而与浏览器窗口进行交互的对象.描述了与浏览器进行交互的方法和接口.通过BOM可以用来获取或设置 ...
 - v-bind的使用
			
v-bind v-bind的引入  内容的绑定可以通过mustache语法,而属性的绑定往往需要通过v-bind 如动态绑定img的src属性 如动态绑定div的class属性 如动态绑定li元素的 ...
 - 企业更需要定制化CRM系统满足个性化需求
			
随着市场的发展和信息技术的进步,越来越多的企业购买CRM客户关系管理系统来帮助管理.提高效率.但哪怕处在相同行业的企业,他们对于CRM的功能需求都会有着很大的不同.因此,大部分企业都开始进行个性化定制 ...
 - CRM客户关系管理系统有哪些优缺点?
			
CRM系统不仅仅是一种技术,也是面向企业的客户管理系统.客户关系管理软件可以帮助销售员快速地找到客户信息,帮助销售员跟踪客户直到完成订单.为提高企业销售效率,CRM被越来越多的企业所采用. 那么,作为 ...