Java中的并发编程集合使用(2)

for (Iterator iterator = lbq.iterator(); iterator.hasNext(); ) {
            String string = (String) iterator.next();
            System.out.println(string);
        }

/**
        * SynchronousQueue:一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。
        * 同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要移除元素时,该元素才存在;
        * 除非另一个线程试图移除某个元素,否则也不能(使用任何方法)插入元素;也不能迭代队列,因为其中没有元素可用于迭代。
        * 队列的头 是尝试添加到队列中的首个已排队插入线程的元素;如果没有这样的已排队线程,则没有可用于移除的元素并且 poll() 将会返回 null。
        * 对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空 collection。此队列不允许 null 元素。
        *
        * 同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,
        * 在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。
        * 对于正在等待的生产者和使用者线程而言,此类支持可选的公平排序策略。默认情况下不保证这种排序。
        * 但是,使用公平设置为 true 所构造的队列可保证线程以 FIFO 的顺序进行访问。
        */
        final SynchronousQueue<String> sq = new SynchronousQueue<String>();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(sq.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();
        Thread t2 = new Thread(new Runnable() {

@Override
            public void run() {
                sq.add("asdasd");
            }
        });
        t2.start();

/**
        * 一个基于已链接节点的、任选范围的阻塞双端队列。
        * 可选的容量范围构造方法参数是一种防止过度膨胀的方式。如果未指定容量,那么容量将等于 Integer.MAX_VALUE。
        * 只要插入元素不会使双端队列超出容量,每次插入后都将动态地创建链接节点。
        * 大多数操作都以固定时间运行(不计阻塞消耗的时间)。
        * 异常包括 remove、removeFirstOccurrence、removeLastOccurrence、contains、iterator.remove() 以及批量操作,它们均以线性时间运行。
        */
        LinkedBlockingDeque<String> dq = new LinkedBlockingDeque<String>(10);
        // 在不违反容量限制的情况下,将指定的元素插入此双端队列的末尾。
        dq.add("1");
        // 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列的开头;如果当前没有空间可用,则抛出 IllegalStateException。
        dq.addFirst("a");
        // 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列的末尾;如果当前没有空间可用,则抛出 IllegalStateException。
        dq.addLast("b");
        // 获取,但不移除此双端队列的第一个元素;如果此双端队列为空,则返回 null。
        System.out.println("查看头元素:" + dq.peekFirst());
        //  获取并移除此双端队列的最后一个元素;如果此双端队列为空,则返回 null。
        System.out.println("获取尾元素:" + dq.pollLast());
        Object[] objs = dq.toArray();
        for (int i = 0; i < objs.length; i++) {
            System.out.println(objs[i]);
        }

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

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