理解Condition的用法

这个示例中BoundedBuffer是一个固定长度的集合,这个在其put操作时,如果发现长度已经达到最大长度,那么会等待notFull信号,如果得到notFull信号会像集合中添加元素,并发出notEmpty的信号,而在其take方法中如果发现集合长度为空,那么会等待notEmpty的信号,同时如果拿到一个元素,那么会发出notFull的信号。

package locks;

import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class AppOfficial {

    /**
     * BoundedBuffer 是一个定长100的集合,当集合中没有元素时,take方法需要等待,直到有元素时才返回元素
     * 当其中的元素数达到最大值时,要等待直到元素被take之后才执行put的操作
     * @author yukaizhao
     *
     */
    static class BoundedBuffer {
        final Lock lock = new ReentrantLock();
        final Condition notFull = lock.newCondition();
        final Condition notEmpty = lock.newCondition();

        final Object[] items = new Object[100];
        int putptr, takeptr, count;

        public void put(Object x) throws InterruptedException {
            System .out.println("put wait lock");
            lock.lock();
            System.out.println("put get lock");
            try {
                while (count == items.length) {
                    System.out.println("buffer full, please wait");
                    notFull.await();
                }

                items[putptr] = x;
                if (++putptr == items.length)
                    putptr = 0;
                ++count;
                notEmpty.signal();
            } finally {
                lock.unlock();
            }
        }

        public Object take() throws InterruptedException {
            System.out.println("take wait lock");
            lock.lock();
            System.out.println("take get lock");
            try {
                while (count == 0) {
                    System.out.println("no elements, please wait");
                    notEmpty.await();
                }
                Object x = items[takeptr];
                if (++takeptr == items.length)
                    takeptr = 0;
                --count;
                notFull.signal();
                return x;
            } finally {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        final BoundedBuffer boundedBuffer = new BoundedBuffer();

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t1 run");
                for (int i=0;i<1000;i++) {
                    try {
                        System.out.println("putting..");
                        boundedBuffer.put(Integer.valueOf(i));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

        }) ;

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0;i<1000;i++) {
                    try {
                        Object val = boundedBuffer.take();
                        System.out.println(val);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

        }) ;

        t1.start();
        t2.start();
    }
}
时间: 2024-10-18 12:39:57

理解Condition的用法的相关文章

深度理解return具体用法

''' 下面我们来更加深度的理解return具体用法!!! return 默认返回None return 可以返回任意数据类型的数据 return 返回多个值的时候,会以元祖的形式把多个值包在一起 ''' '''11111111111111111''' def get_list(): return [1,2,3,4] #返回单个值 lis=get_list() print(lis) #return返回结果是:[1, 2, 3, 4] '''2222222222222222''' def get_

理解学习Func用法

//Func用法 public static class FuncDemo{ public static void TestFunc(){ List<User> usList = Five.GetUserList(); //Select是Func的委托 //public delegate TResult Func<in T,out TResult>(T arg); //out TResult可以自定义输出类型,可以有多少输入in T //usList.Select(new Func

【转载】怎么理解Condition

注:本文主要介绍了Condition和ReentrantLock工具实现独占锁的部分代码原理,Condition能在线程之间协调通信主要是AbstractQueuedSynchronizer和conditon内有两个队列用来切换,整个协作过程是靠结点在AQS的等待队列和Condition的等待队列中来回移动实现的,Condition作为一个条件类,很好的自己维护了一个等待信号的队列,并在适时的时候将结点加入到AQS的等待队列中来实现的唤醒操作. 原文地址:http://www.liuinsect

生产者消费者之关于boost::condition的用法

boost线程库的基本用法这篇文章有介绍到http://www.cppblog.com/fwxjj/archive/2006/12/04/15975.html 我这里只讨论boost::condition在reader/writer模式中的一些注意点 首先我们看只有一个reader/一个writer的情形 #include <boost/thread/mutex.hpp>#include <boost/thread/condition.hpp>#include <boost/

怎么理解Condition(转)

在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用过的人都知道,ReentrantLock(重入锁)是jdk的concurrent包提供的一种独占锁的实现.它继承自Dong Lea的 AbstractQueuedSynchronizer(同步器),确切的说是ReentrantLock的一个内部类继承了AbstractQueuedSynchronizer,ReentrantLock只不过是代理了该类的一些方法,可能有人会问为什

2个简单实例让你快速理解try-catch的用法

相信在实际项目中,你可能经常会看到类似下面的代码 try { // 尝试执行代码块 } catch(err) { // 捕获错误的代码块 } finally { // 结果如何都会执行的代码块 } 简单来说上面的代码是用于处理代码中可能出现的错误信息 try{} 里的代码表示要执行的代码 catch{} 用于捕获 try{} 里代码执行时报的错误信息 finally{} 不管怎样都会执行的代码 下面我会列出一个实例,有时候文字描述不太直观,不便于理解,把相关代码敲一边,试着去理解,或许原先不明白

【Java多线程通信】syncrhoized下wait()/notify()与ReentrantLock下condition的用法比较

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6556925.html  一:syncrhoized使用同一把锁的多个线程用通信实现执行顺序的调度 我们知道,使用syncrhoized关键字修饰一个代码块.一个方式时,在代码块.方法执行完毕之前是不会释放掉所持有的锁的,在执行期间,其他申请这个锁的线程只能阻塞等待.这些等待的线程被安排在一个等待队列中. 现在,由于某种原因,在当前同步代码块A中需要另一个同步代码块B先执行完,然后A才能继续进行下去.而同步代

tp if condition in_array用法

<if condition="in_array($vo['status'],[3])"> <a href="javascript:void(0);" class="go_upload_admin_form" data-id="{$vo.id}">上传表单</a> <elseif condition="in_array($vo['status'],[2,5])" /&

最简单语言理解 webpack 的用法

如果你不知道为啥要用 webpack ,我建议你先读一下下面这段文字,我会用几句话说清楚他的前世今生 当然,如果你知道为什么要用他的话,建议你跳过这段,直接看后面 说白了,其实 webpack 的出现就是为了填以前前端开发留下的一些坑,什么坑呢? 比如2个JS文件不能直接调用,必须用1个html文件把他们引进来,就像这样 script src='a.js' script src='b.js' 这时候 b.js 才能调用 a.js ,这个html文件就像一个中间商,没有他不行 而且,之前如果 a.