Java LinkedTransferQueue 的方法
- Object take() :检索并移除此队列的头部,必要时等待元素变为可用。
- void transfer(Object o) :将元素传输给消费者,必要时等待。
- boolean tryTransfer(Object o) :如果可能,立即将元素传输给等待的消费者。
- boolean tryTransfer(Object o, long timeout, TimeUnit unit) :如果有可能在超时结束之前将元素传输给消费者。
- int getWaitingConsumerCount() :通过 BlockingQueue.take() 或者定时轮询返回等待接收元素的消费者数量的估计。
- boolean hasWaitingConsumer() :如果至少有一个消费者等待通过 BlockingQueue.take() 或者定时轮询接收元素,则返回 true。
- void put(Object o) : 在这个队列的 tail插入指定的元素。</li
- boolean add(object) :在此队列的 tail插入指定的元素。
- boolean offer(object) :在此队列的 tail插入指定的元素。
- boolean remove(object) :从此队列中移除指定元素的单个实例(如果存在)。
- Object peek() :检索但不删除此队列的头部,如果此队列为空,则返回 null。
- Object poll() :检索并移除此队列的头部,如果此队列为空,则返回 null。
- Object poll(timeout, timeUnit) :检索并删除此队列的头部,如果需要元素可用,则等待指定的等待时间。
- void clear() :从此队列中删除所有元素。
- boolean contains(Object o) :如果此队列包含指定的元素,则返回 true。
- Iterator iterator() :以适当的顺序返回此队列中元素的迭代器。
- int size() :返回此队列中的元素数。
- int DrainTo(Collection c) :从此队列中移除所有可用元素并将它们添加到给定集合中。
- int DrainTo(Collection c, int maxElements) :最多从此队列中移除给定数量的可用元素,并将它们添加到给定的集合中。
- int resumeCapacity() :返回此队列在理想情况下(在没有内存或者资源限制的情况下)可以接受而不会阻塞的添加元素的数量。
- Object[] toArray() :以适当的顺序返回一个包含此队列中所有元素的数组。
Java TransferQueue 是一个并发阻塞队列实现,其中生产者可以等待消费者接收消息。
LinkedTransferQueue 类是 Java 中 TransferQueue
的一个实现。
TransferQueue 可能在例如消息传递应用程序中很有用,在这些应用程序中,生产者有时(使用方法 transfer() )等待消费者调用 take 或者 poll 接收元素,而在其他时候排队元素(通过方法 put() )而不等待接收。
当生产者到达TransferQueue传递消息,有消费者等待取消息时,生产者直接将消息传递给消费者。
如果没有消费者在等待,那么生产者不会直接将消息放入并返回,而是等待任何消费者有空来消费该消息。
更多: zhilu jiaocheng
Java LinkedTransferQueue 构造函数
- LinkedTransferQueue() :构造一个初始为空的 LinkedTransferQueue。
- LinkedTransferQueue(Collection c) :构造一个 LinkedTransferQueue 最初包含给定集合的元素,按集合迭代器的遍历顺序添加。
LinkedTransferQueue 特性
- LinkedTransferQueue 是链接节点上的无界队列。
- 该队列根据任何给定的生产者对元素 FIFO(先进先出)进行排序。
- 元素插入在 tail,并从队列的头部检索。
- 它提供阻塞插入和检索操作。
- 它不允许 NULL 对象。
- LinkedTransferQueue 是线程安全的。
- 由于异步性质,size() 方法不是恒定时间操作,因此如果在遍历期间修改此集合,则可能会报告不准确的结果。
- 批量操作 addAll、removeAll、retainAll、containsAll、equals 和 toArray 不能保证以原子方式执行。例如,与 addAll 操作同时运行的迭代器可能只查看一些添加的元素。
Java LinkedTransferQueue 示例
LinkedTransferQueue 示例
从 LinkedTransferQueue 添加和轮询消息的一个非常简单的示例。
LinkedTransferQueue<Integer> linkedTransferQueue = new LinkedTransferQueue<>(); linkedTransferQueue.put(1); System.out.println("Added Message = 1"); Integer message = linkedTransferQueue.poll(); System.out.println("Recieved Message = " + message);
输出:
Added Message = 1 Recieved Message = 1
LinkedTransferQueue 阻塞插入和检索示例
使用阻塞插入和检索从 LinkedTransferQueue 放置和获取元素的 Java 示例。
- 生产者线程将等待消费者准备好从队列中取出项目。
- 如果队列为空,消费者线程将等待。只要队列中有一个元素,它就会取出元素。只有在消费者接受了消息后,生产者才能收到另一条消息。
import java.util.Random; import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.TimeUnit; public class LinkedTransferQueueExample { public static void main(String[] args) throws InterruptedException { LinkedTransferQueue<Integer> linkedTransferQueue = new LinkedTransferQueue<>(); new Thread(() -> { Random random = new Random(1); try { while (true) { System.out.println("Producer is waiting to transfer message..."); Integer message = random.nextInt(); boolean added = linkedTransferQueue.tryTransfer(message); if(added) { System.out.println("Producer added the message - " + message); } Thread.sleep(TimeUnit.SECONDS.toMillis(3)); } } catch (InterruptedException e) { e.printStackTrace(); } }).start(); new Thread(() -> { try { while (true) { System.out.println("Consumer is waiting to take message..."); Integer message = linkedTransferQueue.take(); System.out.println("Consumer recieved the message - " + message); Thread.sleep(TimeUnit.SECONDS.toMillis(3)); } } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } }
输出:
Producer is waiting to transfer message... Consumer is waiting to take message... Producer is waiting to transfer message... Producer added the message - 431529176 Consumer recieved the message - 431529176 Consumer is waiting to take message... Producer is waiting to transfer message... Producer added the message - 1761283695 Consumer recieved the message - 1761283695 Consumer is waiting to take message... Producer is waiting to transfer message... Producer added the message - 1749940626 Consumer recieved the message - 1749940626 Consumer is waiting to take message... Producer is waiting to transfer message... Producer added the message - 892128508 Consumer recieved the message - 892128508 Consumer is waiting to take message... Producer is waiting to transfer message... Producer added the message - 155629808 Consumer recieved the message - 155629808
请注意,控制台中可能有一些打印语句,其中似乎消费者甚至在生产者生成消息之前就已经消费了该消息。
不要混淆,这是因为示例的并发性。
实际上,它按预期工作。
日期:2020-09-17 00:09:49 来源:oir作者:oir