SynchronousQueue 与 BlockingQueue

SynchronousQueue 与 BlockingQueue

package pkg;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;



public class QueueTest {
    public static void main(String[] args) {
        BlockingQueue<String> blockQueue = new LinkedBlockingQueue<String>();//new SynchronousQueue<String>()
        class QueuePuter implements Runnable{
            private BlockingQueue queue;
            public QueuePuter(BlockingQueue queue) {
                this.queue = queue;
            }
            
            public void run() {
                try {
                    for(int i=0;i<10;i++){
                        queue.put("Item "+i);
                        System.out.println("Put  >>> Item "+i);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        
        class QueueTaker implements Runnable{
            private BlockingQueue queue;
            public QueueTaker(BlockingQueue queue) {
                this.queue = queue;
            }
            public void run() {
                try {
                    Object obj = null;
                    while((obj = queue.take())!=null){
                        System.out.println("Take >>> "+obj);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        
        new Thread(new QueueTaker(blockQueue)).start(); 
        //如果是 SynchronousQueue 把这行注释掉 程序会阻塞,说明如果没有线程执行take()操作则所有线程的put()操作都会被阻塞。
        //如果是 LinkedBlockingQueue 把这行注释掉 程序会正常退出,说明就算没有take()操作的线程,所有线程的put()操作也可以把所有数据写入管道,而且管道容量可以不限。
        

        
        new Thread(new QueuePuter(blockQueue)).start();
        //如果是 SynchronousQueue 把这行注释掉 程序会阻塞, 说明如果没有线程执行put()操作则所有线程take()都会被阻塞。而且take()操作执行了几次,put()操作也只能执行几次,说明管道是没有容量的,同时只能操作一个元素。
        //如果是 LinkedBlockingQueue 把这行注释掉 程序会阻塞, 说明如果管道是空的并且没有线程执行put()操作则所有线程take()都会被阻塞。
        
    }
}

  注意2 :它是线程安全的,是阻塞的。
  注意3 :不允许使用 null 元素。
  注意4 :公平排序策略是指调用put的线程之间,或take的线程之间。
 公平排序策略可以查考ArrayBlockingQueue中的公平策略。
  注意5 :SynchronousQueue的以下方法很有趣:
    * iterator() 永远返回空,因为里面没东西。
    * peek() 永远返回null。
    * put() 往queue放进去一个element以后就一直wait直到有其他thread进来把这个element取走。
    * offer() 往queue里放一个element后立即返回,如果碰巧这个element被另一个thread取走了,offer方法返回true,认为offer成功;否则返回false。
    * offer(2000, TimeUnit.SECONDS) 往queue里放一个element但是等待指定的时间后才返回,返回的逻辑和offer()方法一样。
    * take() 取出并且remove掉queue里的element(认为是在queue里的。。。),取不到东西他会一直等。
    * poll() 取出并且remove掉queue里的element(认为是在queue里的。。。),只有到碰巧另外一个线程正在往queue里offer数据或者put数据的时候,该方法才会取到东西。否则立即返回null。
    * poll(2000, TimeUnit.SECONDS) 等待指定的时间然后取出并且remove掉queue里的element,其实就是再等其他的thread来往里塞。
    * isEmpty()永远是true。
    * remainingCapacity() 永远是0。
    * remove()和removeAll() 永远是false。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BlockingQueueJava中的一个接口,用于实现线程间的数据共享和同步。其中的take方法用于从队列中取出元素,并在队列为空时阻塞线程,直到队列中有可取出的元素。 LinkedBlockingQueueBlockingQueue的一个实现类,可以实现put和take的并发执行。它是一个基于链表的阻塞队列,支持FIFO(先进先出)的特性。 LinkedBlockingDeque是另一个BlockingQueue的实现类,它不仅支持FIFO特性,还支持FILO(先进后出)特性。它内部使用了一把全局的ReentrantLock锁来保证线程安全性。 PriorityBlockingQueueBlockingQueue的另一个实现类,它支持按优先级进行排序的特性。可以在插入元素时指定元素的优先级,优先级大的元素会被排在队列的前面。 SynchronousQueueBlockingQueue的另一个实现类,它是一个没有容量的队列,每个插入操作必须等待一个对应的移除操作,反之亦然。这使得SynchronousQueue可以实现线程之间的直接传递数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [BlockingQueue(阻塞队列)](https://blog.csdn.net/mocas_wang/article/details/108476505)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值