zoukankan      html  css  js  c++  java
  • 理解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();
        }
    }
  • 相关阅读:
    Cola:一个分布式爬虫框架
    MichaelBoselowitz/pygit2-examples: Examples of some "porcelain" git commands implemented with python bindings (pygit2) to the libgit2 library.
    https://github.com/mlzboy/spider-impl.git
    Installation and Status — CFFI 1.5.2 documentation
    CENTOS 6.5 安装 Python 2.7 总结
    CENTOS 6.5 安装 Python 2.7 总结
    Create a commit using pygit2
    Create a commit using pygit2
    Create a commit using pygit2
    LindDotNetCore~docker里图像上生成中文乱码问题
  • 原文地址:https://www.cnblogs.com/fengjian/p/6115478.html
Copyright © 2011-2022 走看看