Java多线程中线程间的通信(4)

// take: 取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的数据被加入.
    public Object take() {
        Object ret = null;
        synchronized (lock) {
            while (count.get() == this.minSize) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 1、做移除元素操作
            ret = list.removeFirst();
            // 2、计数器作递减操作
            count.decrementAndGet();
            // 3、唤醒另外一个操作
            lock.notify();
        }

return ret;
    }

// 获取长度
    public int getSize() {
        return this.count.get();
    }

public static void main(String[] args) {

final MyQueue mq = new MyQueue(5);
        mq.put("a");
        mq.put("b");
        mq.put("c");
        mq.put("d");
        mq.put("e");

System.out.println("当前容器的长度:" + mq.getSize());

Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                mq.put("f");
                mq.put("g");
            }
        }, "t1");

t1.start();

Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                Object o1 = mq.take();
                System.out.println("移除的元素为:" + o1);
                Object o2 = mq.take();
                System.out.println("移除的元素为:" + o2);
            }
        }, "t2");

try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

t2.start();
    }
}

程序输出:

新加入的元素为:a
新加入的元素为:b
新加入的元素为:c
新加入的元素为:d
新加入的元素为:e
当前容器的长度:5
移除的元素为:a
移除的元素为:b
新加入的元素为:f
新加入的元素为:g

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e47e1e45b8771c18c0989920ba2fb5a8.html