LinkedTransferQueue 用法
来源:互联网 发布:意大利帅哥 知乎 编辑:程序博客网 时间:2024/06/05 15:08
有人这样评价它:"TransferQueue是是ConcurrentLinkedQueue、SynchronousQueue (公平模式下)、无界的LinkedBlockingQueues等的超集。"
LinkedTransferQueue实现了一个重要的接口TransferQueue,该接口含有下面几个重要方法:
1. transfer(E e):若当前存在一个正在等待获取的消费者线程,即立刻移交之;否则,会插入当前元素e到队列尾部,并且等待进入阻塞状态,到有消费者线程取走该元素。
2. tryTransfer(E e):若当前存在一个正在等待获取的消费者线程(使用take()或者poll()函数),使用该方法会即刻转移/传输对象元素e;若不存在,则返回false,并且不进入队列。这是一个不阻塞的操作。
3. tryTransfer(E e, long timeout, TimeUnit unit):若当前存在一个正在等待获取的消费者线程,会立即传输给它;否则将插入元素e到队列尾部,并且等待被消费者线程获取消费掉;若在指定的时间内元素e无法被消费者线程获取,则返回false,同时该元素被移除。
4. hasWaitingConsumer():判断是否存在消费者线程。
5. getWaitingConsumerCount():获取所有等待获取元素的消费线程数量。
6.size():因为队列的异步特性,检测当前队列的元素个数需要逐一迭代,可能会得到一个不太准确的结果,尤其是在遍历时有可能队列发生更改。
7.批量操作:类似于addAll,removeAll, retainAll, containsAll, equals, toArray等方法,API不能保证一定会立刻执行。因此,我们在使用过程中,不能有所期待,这是一个具有异步特性的队列。
其实transfer方法在SynchronousQueue的实现中就已存在了,只是没有做为API暴露出来。SynchronousQueue有一个特性:它本身不存在容量,只能进行线程之间的元素传送。SynchronousQueue在执行offer操作时,如果没有其他线程执行poll,则直接返回false.线程之间元素传送正是通过transfer方法完成的。
我们知道ThreadPoolExecutor调节线程的原则是:先调整到最小线程,最小线程用完后,他会将优先将任务放入缓存队列(offer(task)),等缓冲队列用完了,才会向最大线程数调节。这似乎与我们所理解的线程池模型有点不同。我们一般采用增加到最大线程后,才会放入缓冲队列中,以达到最大性能。ThreadPoolExecutor代码段:
transfer算法比较复杂,大致的理解是采用所谓双重数据结构(dual data structures)。之所以叫双重,其原因是方法都是通过两个步骤完成:保留与完成。比如消费者线程从一个队列中取元素,发现队列为空,他就生成一个空元素放入队列,所谓空元素就是数据项字段为空。然后消费者线程在这个字段上旅转等待。这叫保留。直到一个生产者线程意欲向队例中放入一个元素,这里他发现最前面的元素的数据项字段为NULL,他就直接把自已数据填充到这个元素中,即完成了元素的传送。
注意事项:
A、无论是transfer还是tryTransfer方法,在>=1个消费者线程等待获取元素时(此时队列为空),都会立刻转交,这属于线程之间的元素交换。注意,这时,元素并没有进入队列。
B、在队列中已有数据情况下,transfer将需要等待前面数据被消费掉,直到传递的元素e被消费线程取走为止。
C、使用transfer方法,工作者线程可能会被阻塞到生产的元素被消费掉为止。
D、消费者线程等待为零的情况下,各自的处理元素入队与否情况有所不同。
E、size()方法,需要迭代,可能不太准确,尽量不要调用。
========================================================================================================实例源码:生产者和消费者进程模拟
生产者源码(Producer):
消费者源码(Consumer):测试类源码:
运行结果(一种可能的结果):
转自:http://blog.csdn.net/yjian2008/article/details/16951811
- LinkedTransferQueue 用法
- LinkedTransferQueue
- java LinkedTransferQueue
- LinkedTransferQueue 理解
- 阻塞队列之LinkedTransferQueue
- 3.集合--LinkedTransferQueue学习
- LinkedTransferQueue原理理解
- 阻塞queue系列之LinkedTransferQueue
- JUC源码分析25-队列-LinkedTransferQueue
- Fork/Join模式(JSR166y)手记之TransferQueue/LinkedTransferQueue
- Bug:LinkedTransferQueue的数据暂失和CPU爆满
- JDK容器与并发—Queue—LinkedTransferQueue
- Java多线程--并发中集合的使用之LinkedTransferQueue
- 【转】J.U.C之阻塞队列:LinkedTransferQueue
- Java 并发 --- 阻塞队列之LinkedTransferQueue源码分析
- 【死磕Java并发】-----J.U.C之阻塞队列:LinkedTransferQueue
- 用法
- ,, 用法
- Oracle定时执行计划任务
- 如何用递归算法判断一个数组是否是递增
- Qt Creator中常用快捷键
- n皇后
- 【VB与数据库】机房收费系统--组合查询
- LinkedTransferQueue 用法
- 基于 mini2440 电阻式触摸屏(三):Linux输入子系统(InputSubsystem)
- python opencc 卡住
- webview加载https地址图片显示不出来问题
- 对栈桢的初步理解
- 图片指纹技术检测图片相似度
- 利用Jenkins玩转Android自动打包发包
- JVM高级特性与实践(一):Java内存区域 与 内存溢出异常
- js和Java分别正则匹配小数点后多余的0