iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
0
Software Development

30 天介紹 Java 的 Thread系列 第 11

Day 11 介紹 LinkedBlockingQueue 類別 (二)

  • 分享至 

  • xImage
  •  

延續昨天介紹 LinkedBlockingQueue class 的部份,今天要介紹如何把 LinkedBlockingQueue 的資料取出來以及檢查元素的值。

取出元素的方式可以呼叫 poll 和 take 二種的方法,以下分別寫一段 sample code 來說明呼叫這二種方法之間的差異:

(1)呼叫 poll 方法

import java.util.concurrent.LinkedBlockingQueue;

public class PollQueueExample {
  public static void main(String args[]) {
    LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
    queue.add("aaa");
    String element1 = queue.poll();
    System.out.println(element1);
    String element2 = queue.poll();
    System.out.println(element2);
  }
}

以上的程式會先把資料放到 Queue 裡面然後會呼叫 poll 方法,去取得資料。當 Queue 裡面沒有資料時會傳回 NULL 的值。

以下為執行結果:

aaa
null

(2)呼叫 take 方法

import java.util.concurrent.LinkedBlockingQueue;

public class TakeQueueExample {

  public static void main(String args[]) throws Exception{
    LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
    queue.add("aaa");
    String element1 = queue.take();
    System.out.println(element1);
    String element2 = queue.take();
    System.out.println(element2);
  }
}

上面的程式會呼叫 take 方法去取得資料,當 Queue 裡面已經沒有資料時,資料就會一直在等待 Queue 裡面有資料,所以程式就不會停止執行。以下為執行的結果:

aaa

poll 和 take 主要的差異就是在取資料時 Queue 為空的時侯,前者會收到 Null,後者程式就會被阻塞住。

檢查 Queue 裡面有沒有資料可以呼叫 element 和 peek 二種的方法,以下也會分別寫一段 sample code 來表示它們之間差異的地方:

(1)呼叫 element 方法

import java.util.concurrent.LinkedBlockingQueue;

public class ElementQueueExample {

  public static void main(String args[]) {
    LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
    queue.add("aaa");
    String element1 = queue.element();
    System.out.println(element1);
    String element2 = queue.element();
    System.out.println(element2);

    queue.remove();
    String element3 = queue.element();
    System.out.println(element3);
  }
}

在以上的程式首先會放入資料到 Queue 裡,然後使用 element 方法把資料的值取出來,但是不會把 Queue 裡面的資料刪除。當 Queue 裡沒有資料時就會收到 NoSuchElementException 的錯誤訊息,執行的結果如下:

aaa
aaa
Exception in thread "main" java.util.NoSuchElementException
	at java.util.AbstractQueue.element(AbstractQueue.java:136)
	at com.company.ElementQueueExample.main(ElementQueueExample.java:16)

(2)呼叫 peek 方法

import java.util.concurrent.LinkedBlockingQueue;

public class PeekQueueExample {
    public static void main(String args[]) throws Exception{
      LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
      queue.add("aaa");
      String element1 = queue.peek();
      System.out.println(element1);
      String element2 = queue.peek();
      System.out.println(element2);

      queue.remove();
      String element3 = queue.peek();
      System.out.println(element3);
    }
}

以上的程式是使用 peek 的方法去取得資料,當 Queue 裡沒有資料的時候呼叫 peek 方法會印出 null 的字串,執行結果如下:

aaa
aaa
null

因此 element 和 peek 主要的差別是當 Queue 為空的時侯呼叫 element 方法會收到 Exception,而 peek 會收到 Null 的值。


上一篇
Day 10 介紹 LinkedBlockingQueue 類別 (一)
下一篇
Day12 使用 Exchanger Class 來交換 Thread 之間的資料
系列文
30 天介紹 Java 的 Thread30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言