<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java `TransferQueue` – Java `LinkedTransferQueue`類 > 原文: [https://howtodoinjava.com/java/collections/transferqueue-linkedtransferqueue/](https://howtodoinjava.com/java/collections/transferqueue-linkedtransferqueue/) Java `TransferQueue`是并發阻塞隊列的實現,在這種實現中,生產者可以等待消費者收到消息。`LinkedTransferQueue`類是 Java 中`TransferQueue`的實現。 例如,`TransferQueue`可能在消息傳遞應用程序中很有用,在該應用程序中,生產者有時(使用方法`transfer()`)通過消費者調用`take`或`poll`來等待元素的接收,而在其他時候則排隊元素(通過方法`put()`)而無需等待收貨。 > 當生產者到達`TransferQueue`傳輸消息并且有消費者在等待接收消息時,生產者直接將消息傳輸給消費者。 > > 如果沒有消費者等待,那么生產者將不會直接放置消息并返回,而是將等待任何消費者可以使用該消息。 ## 1\. `LinkedTransferQueue`特性 讓我們記下 Java 中`LinkedTransferQueue`的幾個要點。 * `LinkedTransferQueue`是鏈接節點上的**無限制**隊列。 * 此隊列針對任何給定的生產者對元素 FIFO(先進先出)進行排序。 * 元素插入到尾部,并從隊列的開頭檢索。 * 它提供**阻塞插入和檢索操作**。 * 它不允許使用`NULL`對象。 * `LinkedTransferQueue`是**線程安全的**。 * 由于異步性質,`size()`方法不是固定時間操作,因此,如果在遍歷期間修改此集合,則可能會報告不正確的結果。 * 不保證批量操作`addAll`,`removeAll`,`retainAll`,`containsAll`,`equals`和`toArray`是原子執行的。 例如,與`addAll`操作并發操作的迭代器可能僅查看某些添加的元素。 ## 2\. Java `LinkedTransferQueue`示例 #### 2.1 `LinkedTransferQueue`示例 一個非常簡單的示例,用于從`LinkedTransferQueue`添加和輪詢消息。 ```java LinkedTransferQueue<Integer> linkedTransferQueue = new LinkedTransferQueue<>(); linkedTransferQueue.put(1); System.out.println("Added Message = 1"); Integer message = linkedTransferQueue.poll(); System.out.println("Recieved Message = " + message); ``` 程序輸出。 ```java Added Message = 1 Recieved Message = 1 ``` #### 2.2 `LinkedTransferQueue`阻塞插入和檢索示例 使用阻塞插入和檢索從`LinkedTransferQueue`放入和取出元素的 Java 示例。 * 生產者線程將等待,直到有消費者準備從隊列中取出項目為止。 * 如果隊列為空,使用者線程將等待。 隊列中只有一個元素時,它將取出該元素。 只有在消費者接受了消息之后,生產者才可以再發送一條消息。 ```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(); } } ``` 程序輸出: ```java 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 ``` 請注意,控制臺中可能有一些打印語句,似乎消費者甚至在生產者生成消息之前就已經使用了該消息。 不要混淆,這是因為示例的并發性。 實際上,它可以按預期工作。 ## 3\. Java `LinkedTransferQueue`構造器 `LinkedTransferQueue`類提供了 3 種不同的方法來用 Java 構造隊列。 * **`LinkedTransferQueue()`**:構造一個最初為空的`LinkedTransferQueue`。 * **`LinkedTransferQueue(Collection c)`**:構造一個`LinkedTransferQueue`,最初包含給定集合的元素,并以集合迭代器的遍歷順序添加。 ## 4\. Java `LinkedTransferQueue`方法 您應該知道`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)`**:將指定的元素插入此隊列的尾部。 * **`boolean add(object)`**:將指定的元素插入此隊列的末尾。 * **`boolean offer(object)`**:將指定的元素插入此隊列的末尾。 * **`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 remainingCapacity()`**:返回此隊列理想情況下(在沒有內存或資源約束的情況下)可以接受而不阻塞的其他元素的數量。 * **`Object[] toArray()`**:按正確的順序返回包含此隊列中所有元素的數組。 ## 5\. Java `TransferQueue`總結 在此 **Java `LinkedTransferQueue`教程**中,我們學習了使用`LinkedTransferQueue`類,這是一個并發阻塞隊列實現,生產者可以在其中等待使用者接收消息。 我們還了解了`LinkedTransferQueue`類的一些重要方法和[構造器](https://howtodoinjava.com/oops/java-constructors/)。 將我的問題放在評論部分。 學習愉快! 參考文獻: [`TransferQueue`接口 Java 文檔](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TransferQueue.html) [`LinkedTransferQueue`類 Java 文檔](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/LinkedTransferQueue.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看