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

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