当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Java LinkedTransferQueue用法及代码示例


LinkedTransferQueueJava 中的类是Java集合框架。它是在JDK 1.7中引入的,它属于java.util.concurrent包。它实现了TransferQueue并提供基于链接节点的无限函数。 LinkedTransferQueue中的元素按照先进先出的顺序排列,头部指向在队列中停留时间最长的元素,尾部指向在队列中停留时间最短的元素。由于其异步特性,size() 会遍历整个集合,因此它不是 O(1) 时间操作。如果在遍历期间修改此集合,它也可能给出不准确的大小。不保证像 addAll、removeAll、retainAll、containsAll、equals 和 toArray 这样的批量操作以原子方式执行。例如,与 addAll 操作同时操作的迭代器可能仅观察到某些添加的元素。

LinkedTransferQueue已使用message-passing应用程序。消息从Producer线程传递到Consumer线程有两个方面。

  1. put(E e):如果生产者想要将元素入队而不等待消费者,则使用此方法。但是,如果队列已满,它将等待直到空间可用。
  2. transfer(E e) :此方法一般用于将元素传输到正在等待接收它的线程,如果没有线程等待,则一旦等待线程到达元素就会等待,直到有线程进入等待状态被转移到其中。

LinkedTransferQueue的层次结构

Hierarchy of LinkedTransferQueue in Java

它实现了可串行化,可迭代<E>,集合<E>,BlockingQueue,传输队列<E>,Queue接口和扩展AbstractQueueAbstractCollection类。

声明:

public class LinkedTransferQueue<E> extends AbstractQueue<E> implements TransferQueue<E>, Serializable

这里,E是该集合维护的元素的类型。

LinkedTransferQueue 的构造函数

为了创建 LinkedTransferQueue 的实例,我们需要从java.util.concurrent包。

1.LinkedTransferQueue():该构造函数用于构造一个空队列。

LinkedTransferQueue<E> ltq = new LinkedTransferQueue<E>();

2. LinkedTransferQueue(Collection<E> c):该构造函数用于构造一个队列,并将 Collection 的元素作为参数传递。

LinkedTransferQueue<E> ltq = new LinkedTransferQueue<E>(Collection<E> c);

示例 1:用 Java 说明 LinkedTransferQueue 的示例程序

Java


// Java Program Demonstrate LinkedTransferQueue 
  
import java.util.concurrent.LinkedTransferQueue; 
import java.util.*; 
  
public class LinkedTransferQueueDemo { 
    public static void main(String[] args) 
        throws InterruptedException 
    { 
        // create object of LinkedTransferQueue 
        // using LinkedTransferQueue() constructor 
        LinkedTransferQueue<Integer> LTQ 
            = new LinkedTransferQueue<Integer>(); 
  
        // Add numbers to end of LinkedTransferQueue 
        LTQ.add(7855642); 
        LTQ.add(35658786); 
        LTQ.add(5278367); 
        LTQ.add(74381793); 
  
        // print Queue 
        System.out.println("Linked Transfer Queue1: " + LTQ); 
  
        // create object of LinkedTransferQueue 
        // using LinkedTransferQueue(Collection c) 
        // constructor 
        LinkedTransferQueue<Integer> LTQ2 
            = new LinkedTransferQueue<Integer>(LTQ); 
  
        // print Queue 
        System.out.println("Linked Transfer Queue2: " + LTQ2); 
    } 
}
输出
Linked Transfer Queue1: [7855642, 35658786, 5278367, 74381793]
Linked Transfer Queue2: [7855642, 35658786, 5278367, 74381793]

示例 2:

Java


// Java code to illustrate 
// methods of LinkedTransferQueue 
  
import java.util.concurrent.LinkedTransferQueue; 
import java.util.*; 
  
public class LinkedTransferQueueDemo { 
    public static void main(String[] args) 
        throws InterruptedException 
    { 
  
        // create object of LinkedTransferQueue 
        LinkedTransferQueue<Integer> LTQ 
            = new LinkedTransferQueue<Integer>(); 
  
        // Add numbers to end of LinkedTransferQueue 
        // using add() method 
        LTQ.add(7855642); 
        LTQ.add(35658786); 
        LTQ.add(5278367); 
        LTQ.add(74381793); 
  
        // prints the Queue 
        System.out.println("Linked Transfer Queue: " + LTQ); 
  
        // prints the size of Queue after removal 
        // using size() method 
        System.out.println("Size of Linked Transfer Queue: "
                           + LTQ.size()); 
  
        // removes the front element and prints it 
        // using poll() method 
        System.out.println("First element: " + LTQ.poll()); 
  
        // prints the Queue 
        System.out.println("Linked Transfer Queue: " + LTQ); 
  
        // prints the size of Queue after removal 
        // using size() method 
        System.out.println("Size of Linked Transfer Queue: "
                           + LTQ.size()); 
  
        // Add numbers to end of LinkedTransferQueue 
        // using offer() method 
        LTQ.offer(20); 
  
        // prints the Queue 
        System.out.println("Linked Transfer Queue: " + LTQ); 
  
        // prints the size of Queue after removal 
        // using size() method 
        System.out.println("Size of Linked Transfer Queue: "
                           + LTQ.size()); 
    } 
}
输出
Linked Transfer Queue: [7855642, 35658786, 5278367, 74381793]
Size of Linked Transfer Queue: 4
First element: 7855642
Linked Transfer Queue: [35658786, 5278367, 74381793]
Size of Linked Transfer Queue: 3
Linked Transfer Queue: [35658786, 5278367, 74381793, 20]
Size of Linked Transfer Queue: 4

Basic Operations

1. 添加元素

LinkedTransferQueue 提供了多种添加或插入元素的方法。它们是add(E e)put(E e)offer(E e)transfer(E e)。当 transfer() 等待一个或多个接收线程时,add、put 和 Offer 方法不关心其他线程是否访问队列。

Java


// Java Program Demonstrate adding 
// elements to LinkedTransferQueue 
  
import java.util.concurrent.*; 
  
class AddingElementsExample { 
    public static void main(String[] args) 
    { 
  
        // Initializing the queue 
        LinkedTransferQueue<Integer> queue 
            = new LinkedTransferQueue<Integer>(); 
  
        // Adding elements to this queue 
        for (int i = 10; i <= 14; i++) 
            queue.add(i); 
  
        // Add the element using offer() method 
        System.out.println("adding 15 "
            + queue.offer(15, 5, TimeUnit.SECONDS)); 
  
        // Adding elements to this queue 
        for (int i = 16; i <= 20; i++) 
            queue.put(i); 
  
        // Printing the elements of the queue 
        System.out.println( 
            "The elements in the queue are:"); 
        for (Integer i : queue) 
            System.out.print(i + " "); 
  
        System.out.println(); 
  
        // create another queue to demonstrate transfer 
        // method 
        LinkedTransferQueue<String> g 
            = new LinkedTransferQueue<String>(); 
  
        new Thread(new Runnable() { 
            public void run() 
            { 
                try { 
                    System.out.println("Transferring"
                                       + " an element"); 
  
                    // Transfer a String element 
                    // using transfer() method 
                    g.transfer("is a computer"
                               + " science portal."); 
                    System.out.println( 
                        "Element "
                        + "transfer is complete"); 
                } 
                catch (InterruptedException e1) { 
                    System.out.println(e1); 
                } 
                catch (NullPointerException e2) { 
                    System.out.println(e2); 
                } 
            } 
        }) 
            .start(); 
  
        try { 
  
            // Get the transferred element 
            System.out.println("Geeks for Geeks "
                               + g.take()); 
        } 
        catch (Exception e) { 
            System.out.println(e); 
        } 
    } 
}
输出
adding 15 true
The elements in the queue are:
10 11 12 13 14 15 16 17 18 19 20 
Transferring an element
Geeks for Geeks is a computer science portal.
Element transfer is complete

2. 删除元素

LinkedTransferQueue 提供的 remove() 方法用于删除此队列中存在的元素。

Java


// Java Program Demonstrate removing 
// elements of LinkedTransferQueue 
  
import java.util.concurrent.LinkedTransferQueue; 
  
class RemoveElementsExample { 
    public static void main(String[] args) 
    { 
        // Initializing the queue 
        LinkedTransferQueue<Integer> queue 
            = new LinkedTransferQueue<Integer>(); 
  
        // Adding elements to this queue 
        for (int i = 1; i <= 5; i++) 
            queue.add(i); 
  
        // Printing the elements of the queue 
        System.out.println( 
            "The elements in the queue are:"); 
        for (Integer i : queue) 
            System.out.print(i + " "); 
  
        // remove() method will remove the specified 
        // element from the queue 
        queue.remove(1); 
        queue.remove(5); 
  
        // Printing the elements of the queue 
        System.out.println("\nRemaining elements in queue : "); 
        for (Integer i : queue) 
            System.out.print(i + " "); 
    } 
}
输出
The elements in the queue are:
1 2 3 4 5 
Remaining elements in queue : 
2 3 4 

3. 迭代

LinkedTransferQueue 的 iterator() 方法用于按正确的顺序返回对此队列中元素的迭代器。

Java


// Java Program Demonstrate iterating 
// over LinkedTransferQueue 
  
import java.util.Iterator; 
import java.util.concurrent.LinkedTransferQueue; 
  
class LinkedTransferQueueIteratorExample { 
    public static void main(String[] args) 
    { 
  
        // Initializing the queue 
        LinkedTransferQueue<String> queue 
            = new LinkedTransferQueue<String>(); 
  
        // Adding elements to this queue 
        queue.add("Gfg"); 
        queue.add("is"); 
        queue.add("fun!!"); 
  
        // Returns an iterator over the elements 
        Iterator<String> iterator = queue.iterator(); 
  
        // Printing the elements of the queue 
        while (iterator.hasNext()) 
            System.out.print(iterator.next() + " "); 
    } 
}
输出
Gfg is fun!! 

LinkedTransferQueue的方法

METHOD

DESCRIPTION

LinkedTransferQueue add() 将指定元素插入此队列的尾部。
contains(Object o) 如果此队列包含指定元素,则返回 true。
dropTo(Collection<? super E> c) 从此队列中删除所有可用元素并将它们添加到给定集合中。
dropTo(Collection<? super E> c, int maxElements) 从此队列中删除最多给定数量的可用元素并将它们添加到给定的集合中。
forEach(消费者<? super E> 操作) 对 Iterable 的每个元素执行给定的操作,直到处理完所有元素或该操作引发异常。
isEmpty() 如果此队列不包含元素,则返回 true。
iterator() 按正确顺序返回此队列中元素的迭代器。
offer(E e) 将指定元素插入此队列的尾部。
offer(E e, long timeout, TimeUnit unit) 将指定元素插入此队列的尾部。
put(E e) 将指定元素插入此队列的尾部。
remainingCapacity() 始终返回 Integer.MAX_VALUE,因为 LinkedTransferQueue 不受容量限制。
remove(Object o) 从此队列中删除指定元素的单个实例(如果存在)。
移除全部(集合<?> c) 删除指定集合中也包含的所有该集合的元素(可选操作)。
removeIf(Predicate<? super E> 过滤器) 删除此集合中满足给定谓词的所有元素。
keepAll(集合<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
size() 返回此队列中的元素数量。
spliterator() 返回此队列中元素的Spliterator
toArray() 返回一个数组,其中按正确的顺序包含此队列中的所有元素。
toArray(T[] a) 返回一个数组,其中包含此队列中的所有元素(按正确的顺序);返回数组的运行时类型是指定数组的运行时类型。
transfer(E e) 将元素传输给使用者,并在必要时等待。
tryTransfer(E e) 如果可能,立即将元素传输给等待的消费者。
tryTransfer(E e, long timeout, TimeUnit unit) 如果可以在超时之前将元素传输给使用者,则将其传输给使用者。

类 java.util.AbstractQueue 中声明的方法

METHOD

DESCRIPTION

AbstractQueue addAll() 将指定集合中的所有元素添加到此队列。
AbstractQueue clear() 从此队列中删除所有元素。
AbstractQueue element() 检索但不删除此队列的头部。
AbstractQueue remove() 检索并删除此队列的头部。

类 java.util.AbstractCollection 中声明的方法

METHOD

DESCRIPTION

AbstractCollection containsAll() 如果此集合包含指定集合中的所有元素,则返回 true。
AbstractCollection toString() 返回此集合的字符串表示形式。

接口 java.util.concurrent.BlockingQueue 中声明的方法

METHOD

DESCRIPTION

BlockingQueue poll() 检索并删除此队列的头部,如果需要元素变得可用,则等待指定的等待时间。
BlockingQueue take() 检索并删除此队列的头部,如有必要,则等待直到有元素可用。

接口 java.util.Collection 中声明的方法

METHOD

DESCRIPTION

Collection addAll() 将指定集合中的所有元素添加到此集合中(可选操作)。
clear() 从此集合中删除所有元素(可选操作)。
containsAll(集合<?> c) 如果此集合包含指定集合中的所有元素,则返回 true。
equals(Object o) 比较指定对象与此集合是否相等。
hashCode() 返回此集合的哈希码值。
parallelStream() 返回一个可能并行的 Stream 并以此集合作为其源。
stream() 返回以此集合作为源的顺序 Stream。
toArray(IntFunction<T[]> 生成器) 返回一个包含此集合中所有元素的数组,使用提供的生成器函数分配返回的数组。

接口 java.util.Queue 中声明的方法

METHOD

DESCRIPTION

Queue element() 检索但不删除此队列的头部。
Queue peek() 检索但不删除此队列的头部,如果此队列为空,则返回 null。
Queue poll() 检索并删除此队列的头部,如果此队列为空,则返回 null。
Queue remove() 检索并删除此队列的头部。

接口 java.util.concurrent.TransferQueue 中声明的方法

METHOD

DESCRIPTION

LinkedTransferQueue getWaitingConsumerCount() 返回通过 BlockingQueue.take() 或定时 poll 等待接收元素的消费者数量的估计值。
LinkedTransferQueue hasWaitingConsumer() 如果至少有一个消费者正在等待通过 BlockingQueue.take() 或定时 poll 接收元素,则返回 true。

参考:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/LinkedTransferQueue.html



相关用法


注:本文由纯净天空筛选整理自RishabhPrabhu大神的英文原创作品 LinkedTransferQueue in Java with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。