広告

Java : LinkedBlockingDeque (ブロッキング・リンク両端キュー) - API使用例

LinkedBlockingDeque (Java SE 20 & JDK 20) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

リンク・ノードに基づく、オプションで制限付きになるブロッキング両端キューです。

クラス構成

LinkedBlockingDeque は、

  • 要素を取り出すときに、もし空だったら要素が追加されるまで待機

という操作が可能な BlockingDeque の実装です。

要素はリンク・ノードで管理されます。

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>();

    final var future = executor.submit(() -> {
        try {
            while (true) {
                System.out.println("  take ...");
                final var value = deque.takeFirst();

                System.out.printf("  take OK! : value = %s (%f sec.)%n",
                        value, elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.println("  InterruptedException!");
        }
    });

    System.out.printf("put values (%f sec.)%n", elapsedTime.getAsDouble());

    deque.putLast("aaa");
    deque.putLast("bbb");
    deque.putLast("ccc");

    TimeUnit.SECONDS.sleep(5);

    System.out.printf("put values (%f sec.)%n", elapsedTime.getAsDouble());

    deque.putLast("XXX");
    deque.putLast("YYY");
    deque.putLast("ZZZ");

    TimeUnit.SECONDS.sleep(5);

    System.out.println("future.cancel");
    future.cancel(true);
}

// 結果
// ↓
//put values (0.002803 sec.)
//  take ...
//  take OK! : value = aaa (0.004257 sec.)
//  take ...
//  take OK! : value = bbb (0.004373 sec.)
//  take ...
//  take OK! : value = ccc (0.004504 sec.)
//  take ...
//put values (5.005572 sec.)
//  take OK! : value = XXX (5.005799 sec.)
//  take ...
//  take OK! : value = YYY (5.005917 sec.)
//  take ...
//  take OK! : value = ZZZ (5.006012 sec.)
//  take ...
//future.cancel
//  InterruptedException!

コンストラクタ

LinkedBlockingDeque ()

容量Integer.MAX_VALUEでLinkedBlockingDequeを作成します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []
System.out.println(deque.remainingCapacity()); // 2147483647

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

LinkedBlockingDeque (int capacity)

指定された固定容量でLinkedBlockingDequeを作成します。

final var deque = new LinkedBlockingDeque<String>(3);

System.out.println(deque); // []
System.out.println(deque.size()); // 0
System.out.println(deque.remainingCapacity()); // 3

System.out.println(deque.offerLast("aaa")); // true

System.out.println(deque); // [aaa]
System.out.println(deque.size()); // 1
System.out.println(deque.remainingCapacity()); // 2

System.out.println(deque.offerLast("bbb")); // true

System.out.println(deque); // [aaa, bbb]
System.out.println(deque.size()); // 2
System.out.println(deque.remainingCapacity()); // 1

System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]
System.out.println(deque.size()); // 3
System.out.println(deque.remainingCapacity()); // 0

System.out.println(deque.offerLast("XXX")); // false

System.out.println(deque); // [aaa, bbb, ccc]
System.out.println(deque.size()); // 3
System.out.println(deque.remainingCapacity()); // 0

System.out.println(deque.pollFirst()); // aaa

System.out.println(deque); // [bbb, ccc]
System.out.println(deque.size()); // 2
System.out.println(deque.remainingCapacity()); // 1

System.out.println(deque.offerLast("YYY")); // true

System.out.println(deque); // [bbb, ccc, YYY]
System.out.println(deque.size()); // 3
System.out.println(deque.remainingCapacity()); // 0

LinkedBlockingDeque (Collection<? extends E> c)

指定されたコレクションの要素を初期状態で含む(要素はコレクションのイテレータのトラバーサル順に追加) LinkedBlockingDequeを容量Integer.MAX_VALUEで作成します。

final var c = List.of("a", "b", "c");

final var deque = new LinkedBlockingDeque<>(c);
System.out.println(deque); // [a, b, c]
System.out.println(deque.size()); // 3

メソッド

boolean add (E e)

容量制限に違反しないかぎり、指定された要素をこの両端キューの末尾に挿入します。

このメソッドは addLast(E e) と同等です。
API使用例はそちらをご参照ください。

boolean addAll (Collection<? extends E> c)

指定されたコレクション内のすべての要素を、指定されたコレクションのイテレータによって返される順序でこの両端キューの最後に追加します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.addAll(List.of("a1"))); // true
System.out.println(deque); // [a1]

System.out.println(deque.addAll(List.of("b1", "b2"))); // true
System.out.println(deque); // [a1, b1, b2]

System.out.println(deque.addAll(List.of("c1", "c2", "c3"))); // true
System.out.println(deque); // [a1, b1, b2, c1, c2, c3]

void addFirst (E e)

容量制限に違反することなく指定された要素をこの両端キューの先頭にすぐに挿入できる場合には、そうします。使用可能な空き領域がその時点で存在しない場合はIllegalStateExceptionをスローします。

// capacity = 3
final var deque = new LinkedBlockingDeque<String>(3);
System.out.println(deque); // []

deque.addFirst("aaa");
System.out.println(deque); // [aaa]

deque.addFirst("bbb");
System.out.println(deque); // [bbb, aaa]

deque.addFirst("ccc");
System.out.println(deque); // [ccc, bbb, aaa]

try {
    deque.addFirst("ddd");
} catch (IllegalStateException e) {
    System.out.println("IllegalStateException! : " + e.getMessage());
}

// 結果
// ↓
//IllegalStateException! : Deque full

void addLast (E e)

容量制限に違反することなく指定された要素をこの両端キューの末尾にすぐに挿入できる場合には、そうします。使用可能な空き領域がその時点で存在しない場合はIllegalStateExceptionをスローします。

// capacity = 3
final var deque = new LinkedBlockingDeque<String>(3);
System.out.println(deque); // []

deque.addLast("aaa");
System.out.println(deque); // [aaa]

deque.addLast("bbb");
System.out.println(deque); // [aaa, bbb]

deque.addLast("ccc");
System.out.println(deque); // [aaa, bbb, ccc]

try {
    deque.addLast("ddd");
} catch (IllegalStateException e) {
    System.out.println("IllegalStateException! : " + e.getMessage());
}

// 結果
// ↓
//IllegalStateException! : Deque full

void clear ()

すべての要素をこの両端キューから原子的に削除します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

deque.addLast("a");
System.out.println(deque); // [a]

deque.addLast("b");
System.out.println(deque); // [a, b]

deque.clear();
System.out.println(deque); // []

boolean contains (Object o)

指定された要素がこの両端キューに含まれている場合にtrueを返します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.contains("aaa")); // true
System.out.println(deque.contains("bbb")); // true
System.out.println(deque.contains("XXX")); // false

Iterator<E> descendingIterator ()

この両端キュー内の要素を逆順で反復処理するイテレータを返します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

final var iterator = deque.descendingIterator();

System.out.println("-- forEachRemaining --");
iterator.forEachRemaining(value -> {
    System.out.println("value = " + value);
});

// 結果
// ↓
//-- forEachRemaining --
//value = ccc
//value = bbb
//value = aaa

int drainTo (Collection<? super E> c)

このキューから利用可能なすべての要素を削除し、それらを指定されたコレクションに追加します。

final var deque = new LinkedBlockingDeque<String>();
final var c = new ArrayList<String>();

System.out.println(deque.offerLast("aaa")); // true

System.out.println(deque); // [aaa]
System.out.println(c); // []

System.out.println(deque.drainTo(c)); // 1

System.out.println(deque); // []
System.out.println(c); // [aaa]

System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [bbb, ccc]
System.out.println(c); // [aaa]

System.out.println(deque.drainTo(c)); // 2

System.out.println(deque); // []
System.out.println(c); // [aaa, bbb, ccc]

int drainTo (Collection<? super E> c, int maxElements)

指定された数以内の利用可能な要素をこのキューから削除し、指定されたコレクションに追加します。

final var deque = new LinkedBlockingDeque<String>();
final var c = new ArrayList<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]
System.out.println(c); // []

System.out.println(deque.drainTo(c, 10)); // 3

System.out.println(deque); // []
System.out.println(c); // [aaa, bbb, ccc]

System.out.println(deque.offerLast("XXX")); // true
System.out.println(deque.offerLast("YYY")); // true
System.out.println(deque.offerLast("ZZZ")); // true

System.out.println(deque); // [XXX, YYY, ZZZ]
System.out.println(c); // [aaa, bbb, ccc]

System.out.println(deque.drainTo(c, 2)); // 2

System.out.println(deque); // [ZZZ]
System.out.println(c); // [aaa, bbb, ccc, XXX, YYY]

E element ()

この両端キューで表されるキューの先頭を取得しますが、削除しません。

このメソッドは getFirst() と同等です。
API使用例はそちらをご参照ください。

void forEach (Consumer<? super E> action)

Iterableの各要素に対して指定されたアクションを、すべての要素が処理されるか、アクションが例外をスローするまで実行します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

System.out.println("-- forEach --");
deque.forEach(value -> {
    System.out.println("value = " + value);
});

// 結果
// ↓
//-- forEach --
//value = aaa
//value = bbb
//value = ccc

E getFirst ()

この両端キューの最初の要素を取得しますが、削除はしません。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque.getFirst()); // aaa
System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.removeFirst()); // aaa
System.out.println(deque); // [bbb, ccc]

System.out.println(deque.getFirst()); // bbb
System.out.println(deque); // [bbb, ccc]

System.out.println(deque.removeFirst()); // bbb
System.out.println(deque); // [ccc]

System.out.println(deque.getFirst()); // ccc
System.out.println(deque); // [ccc]

System.out.println(deque.removeFirst()); // ccc
System.out.println(deque); // []

try {
    deque.getFirst();
} catch (NoSuchElementException e) {
    System.out.println("NoSuchElementException!");
}

// 結果
// ↓
//NoSuchElementException!

E getLast ()

この両端キューの最後の要素を取得しますが、削除はしません。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque.getLast()); // ccc
System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.removeLast()); // ccc
System.out.println(deque); // [aaa, bbb]

System.out.println(deque.getLast()); // bbb
System.out.println(deque); // [aaa, bbb]

System.out.println(deque.removeLast()); // bbb
System.out.println(deque); // [aaa]

System.out.println(deque.getLast()); // aaa
System.out.println(deque); // [aaa]

System.out.println(deque.removeLast()); // aaa
System.out.println(deque); // []

try {
    deque.getLast();
} catch (NoSuchElementException e) {
    System.out.println("NoSuchElementException!");
}

// 結果
// ↓
//NoSuchElementException!

Iterator<E> iterator ()

この両端キュー内の要素を適切な順序で反復処理するイテレータを返します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

final var iterator = deque.iterator();

System.out.println("-- forEachRemaining --");
iterator.forEachRemaining(value -> {
    System.out.println("value = " + value);
});

// 結果
// ↓
//-- forEachRemaining --
//value = aaa
//value = bbb
//value = ccc

boolean offer (E e)

指定された要素を、この両端キューで表されるキュー(つまり、この両端キューの末尾)に、容量制限に違反することなしにすぐに挿入できる場合には、そうします。成功した場合はtrueを返し、使用可能な空き領域がその時点で存在しない場合はfalseを返します。

このメソッドは offerLast(E e) と同等です。
API使用例はそちらをご参照ください。

boolean offer (E e, long timeout, TimeUnit unit)

指定された要素をこの両端キューで表されるキュー(つまり、この両端キューの末尾)に挿入します。必要に応じて、指定された待機時間まで空きが生じるのを待機します。

このメソッドは offerLast(E e, long timeout, TimeUnit unit) と同等です。
API使用例はそちらをご参照ください。

boolean offerFirst (E e)

容量制限に違反することなしに指定された要素をこの両端キューの先頭にすぐに挿入できる場合には、そうします。成功した場合はtrueを返し、使用可能な空き領域がその時点で存在しない場合はfalseを返します。

// capacity = 3
final var deque = new LinkedBlockingDeque<String>(3);
System.out.println(deque); // []

System.out.println(deque.offerFirst("aaa")); // true
System.out.println(deque); // [aaa]

System.out.println(deque.offerFirst("bbb")); // true
System.out.println(deque); // [bbb, aaa]

System.out.println(deque.offerFirst("ccc")); // true
System.out.println(deque); // [ccc, bbb, aaa]

System.out.println(deque.offerFirst("ddd")); // false
System.out.println(deque); // [ccc, bbb, aaa]

boolean offerFirst (E e, long timeout, TimeUnit unit)

指定された要素をこの両端キューの先頭に挿入します。必要に応じて、指定された待機時間まで空きが生じるのを待機します。

関連 : offerFirst(E e)

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>(3);
    System.out.printf("remainingCapacity = %d (%f sec.)%n",
            deque.remainingCapacity(), elapsedTime.getAsDouble());

    executor.submit(() -> {
        try {
            final var list = List.of("aaa", "bbb", "ccc", "ddd");
            for (final var value : list) {
                System.out.println("  offer ...");
                final var ret = deque.offerFirst(value, 5, TimeUnit.SECONDS);

                System.out.printf("  offer ret = %b (%f sec.)%n",
                        ret, elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.println("  InterruptedException!");
        }
    });

    TimeUnit.SECONDS.sleep(10);

    System.out.printf("deque = %s (%f sec.)%n", deque, elapsedTime.getAsDouble());
}

// 結果
// ↓
//remainingCapacity = 3 (0.001542 sec.)
//  offer ...
//  offer ret = true (0.004937 sec.)
//  offer ...
//  offer ret = true (0.005130 sec.)
//  offer ...
//  offer ret = true (0.005283 sec.)
//  offer ...
//  offer ret = false (5.006191 sec.)
//deque = [ccc, bbb, aaa] (10.007285 sec.)

boolean offerLast (E e)

容量制限に違反することなしに指定された要素をこの両端キューの末尾にすぐに挿入できる場合には、そうします。成功した場合はtrueを返し、使用可能な空き領域がその時点で存在しない場合はfalseを返します。

// capacity = 3
final var deque = new LinkedBlockingDeque<String>(3);
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque); // [aaa]

System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque); // [aaa, bbb]

System.out.println(deque.offerLast("ccc")); // true
System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.offerLast("ddd")); // false
System.out.println(deque); // [aaa, bbb, ccc]

boolean offerLast (E e, long timeout, TimeUnit unit)

指定された要素をこの両端キューの末尾に挿入します。必要に応じて、指定された待機時間まで空きが生じるのを待機します。

関連 : offerLast(E e)

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>(3);
    System.out.printf("remainingCapacity = %d (%f sec.)%n",
            deque.remainingCapacity(), elapsedTime.getAsDouble());

    executor.submit(() -> {
        try {
            final var list = List.of("aaa", "bbb", "ccc", "ddd");
            for (final var value : list) {
                System.out.println("  offer ...");
                final var ret = deque.offerLast(value, 5, TimeUnit.SECONDS);

                System.out.printf("  offer ret = %b (%f sec.)%n",
                        ret, elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.println("  InterruptedException!");
        }
    });

    TimeUnit.SECONDS.sleep(10);

    System.out.printf("deque = %s (%f sec.)%n", deque, elapsedTime.getAsDouble());
}

// 結果
// ↓
//remainingCapacity = 3 (0.001525 sec.)
//  offer ...
//  offer ret = true (0.004320 sec.)
//  offer ...
//  offer ret = true (0.004461 sec.)
//  offer ...
//  offer ret = true (0.004566 sec.)
//  offer ...
//  offer ret = false (5.013237 sec.)
//deque = [aaa, bbb, ccc] (10.015890 sec.)

E peek ()

この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得しますが、削除しません。両端キューが空の場合は、nullを返します。

このメソッドは peekFirst() と同等です。
API使用例はそちらをご参照ください。

E peekFirst ()

この両端キューの最初の要素を取得しますが、削除しません。両端キューが空の場合はnullを返します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque.peekFirst()); // aaa
System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.pollFirst()); // aaa
System.out.println(deque); // [bbb, ccc]

System.out.println(deque.peekFirst()); // bbb
System.out.println(deque); // [bbb, ccc]

System.out.println(deque.pollFirst()); // bbb
System.out.println(deque); // [ccc]

System.out.println(deque.peekFirst()); // ccc
System.out.println(deque); // [ccc]

System.out.println(deque.pollFirst()); // ccc
System.out.println(deque); // []

System.out.println(deque.peekFirst()); // null
System.out.println(deque); // []

E peekLast ()

この両端キューの最後の要素を取得しますが、削除しません。両端キューが空の場合はnullを返します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque.peekLast()); // ccc
System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.pollLast()); // ccc
System.out.println(deque); // [aaa, bbb]

System.out.println(deque.peekLast()); // bbb
System.out.println(deque); // [aaa, bbb]

System.out.println(deque.pollLast()); // bbb
System.out.println(deque); // [aaa]

System.out.println(deque.peekLast()); // aaa
System.out.println(deque); // [aaa]

System.out.println(deque.pollLast()); // aaa
System.out.println(deque); // []

System.out.println(deque.peekLast()); // null
System.out.println(deque); // []

E poll ()

この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得および削除します。両端キューが空の場合は、nullを返します。

このメソッドは pollFirst() と同等です。
API使用例はそちらをご参照ください。

E poll (long timeout, TimeUnit unit)

この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得して削除します。必要に応じて、指定された待機時間まで要素が利用可能になるのを待機します。

このメソッドは pollFirst(long timeout, TimeUnit unit) と同等です。
API使用例はそちらをご参照ください。

E pollFirst ()

この両端キューの最初の要素を取得および削除します。両端キューが空の場合はnullを返します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.pollFirst()); // aaa
System.out.println(deque); // [bbb, ccc]

System.out.println(deque.pollFirst()); // bbb
System.out.println(deque); // [ccc]

System.out.println(deque.pollFirst()); // ccc
System.out.println(deque); // []

System.out.println(deque.pollFirst()); // null
System.out.println(deque); // []

E pollFirst (long timeout, TimeUnit unit)

この両端キューの最初の要素を取得して削除します。必要に応じて、指定された待機時間まで要素が利用可能になるのを待機します。

関連 : pollFirst()

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>();

    System.out.printf("put values (%f sec.)%n", elapsedTime.getAsDouble());

    deque.putLast("aaa");
    deque.putLast("bbb");
    deque.putLast("ccc");

    final var future = executor.submit(() -> {
        try {
            while (true) {
                System.out.println("  poll ...");
                final var value = deque.pollFirst(5, TimeUnit.SECONDS);

                System.out.printf("  poll value = %s (%f sec.)%n",
                        value, elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.println("  InterruptedException!");
        }
    });

    TimeUnit.SECONDS.sleep(8);

    System.out.println("future.cancel");
    future.cancel(true);
}

// 結果
// ↓
//put values (0.001490 sec.)
//  poll ...
//  poll value = aaa (0.004407 sec.)
//  poll ...
//  poll value = bbb (0.004601 sec.)
//  poll ...
//  poll value = ccc (0.004791 sec.)
//  poll ...
//  poll value = null (5.019794 sec.)
//  poll ...
//future.cancel
//  InterruptedException!

E pollLast ()

この両端キューの最後の要素を取得および削除します。両端キューが空の場合はnullを返します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.pollLast()); // ccc
System.out.println(deque); // [aaa, bbb]

System.out.println(deque.pollLast()); // bbb
System.out.println(deque); // [aaa]

System.out.println(deque.pollLast()); // aaa
System.out.println(deque); // []

System.out.println(deque.pollLast()); // null
System.out.println(deque); // []

E pollLast (long timeout, TimeUnit unit)

この両端キューの最後の要素を取得して削除します。必要に応じて、指定された待機時間まで要素が利用可能になるのを待機します。

関連 : pollLast()

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>();

    System.out.printf("put values (%f sec.)%n", elapsedTime.getAsDouble());

    deque.putLast("aaa");
    deque.putLast("bbb");
    deque.putLast("ccc");

    final var future = executor.submit(() -> {
        try {
            while (true) {
                System.out.println("  poll ...");
                final var value = deque.pollLast(5, TimeUnit.SECONDS);

                System.out.printf("  poll value = %s (%f sec.)%n",
                        value, elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.println("  InterruptedException!");
        }
    });

    TimeUnit.SECONDS.sleep(8);

    System.out.println("future.cancel");
    future.cancel(true);
}

// 結果
// ↓
//put values (0.001527 sec.)
//  poll ...
//  poll value = ccc (0.004063 sec.)
//  poll ...
//  poll value = bbb (0.004186 sec.)
//  poll ...
//  poll value = aaa (0.004302 sec.)
//  poll ...
//  poll value = null (5.013818 sec.)
//  poll ...
//future.cancel
//  InterruptedException!

E pop ()

この両端キューで表されるスタックに要素をポップします。

このメソッドは removeFirst() と同等です。
API使用例はそちらをご参照ください。

void push (E e)

容量制限に違反することなしに要素をこの両端キューで表されるスタック(つまり、この両端キューの先頭)にすぐにプッシュできる場合は、そうします。使用可能な空き領域がその時点で存在しない場合はIllegalStateExceptionをスローします。

このメソッドは addFirst(E e) と同等です。
そちらのAPI使用例をご参照ください。

void put (E e)

指定された要素をこの両端キューで表されるキュー(つまり、この両端キューの末尾)に挿入します。必要に応じて、空きが生じるまで待機します。

このメソッドは putLast(E e) と同等です。
API使用例はそちらをご参照ください。

void putFirst (E e)

指定された要素をこの両端キューの先頭に挿入します。必要に応じて、空きが生じるまで待機します。

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>(3);
    System.out.printf("remainingCapacity = %d (%f sec.)%n",
            deque.remainingCapacity(), elapsedTime.getAsDouble());

    final var future = executor.submit(() -> {
        try {
            final var list = List.of("aaa", "bbb", "ccc", "ddd");
            for (final var value : list) {
                System.out.println("  put ...");
                deque.putFirst(value);

                System.out.printf("  put OK! (%f sec.)%n", elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.printf("  InterruptedException! (%f sec.)%n", elapsedTime.getAsDouble());
        }
    });

    TimeUnit.SECONDS.sleep(5);

    System.out.printf("deque = %s (%f sec.)%n", deque, elapsedTime.getAsDouble());

    System.out.println("future.cancel");
    future.cancel(true);
}

// 結果
// ↓
//remainingCapacity = 3 (0.001544 sec.)
//  put ...
//  put OK! (0.006679 sec.)
//  put ...
//  put OK! (0.006793 sec.)
//  put ...
//  put OK! (0.006899 sec.)
//  put ...
//deque = [ccc, bbb, aaa] (5.010734 sec.)
//future.cancel
//  InterruptedException! (5.011484 sec.)

void putLast (E e)

指定された要素をこの両端キューの末尾に挿入します。必要に応じて、空きが生じるまで待機します。

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>(3);
    System.out.printf("remainingCapacity = %d (%f sec.)%n",
            deque.remainingCapacity(), elapsedTime.getAsDouble());

    final var future = executor.submit(() -> {
        try {
            final var list = List.of("aaa", "bbb", "ccc", "ddd");
            for (final var value : list) {
                System.out.println("  put ...");
                deque.putLast(value);

                System.out.printf("  put OK! (%f sec.)%n", elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.printf("  InterruptedException! (%f sec.)%n", elapsedTime.getAsDouble());
        }
    });

    TimeUnit.SECONDS.sleep(5);

    System.out.printf("deque = %s (%f sec.)%n", deque, elapsedTime.getAsDouble());

    System.out.println("future.cancel");
    future.cancel(true);
}

// 結果
// ↓
//remainingCapacity = 3 (0.001664 sec.)
//  put ...
//  put OK! (0.006416 sec.)
//  put ...
//  put OK! (0.006584 sec.)
//  put ...
//  put OK! (0.006753 sec.)
//  put ...
//deque = [aaa, bbb, ccc] (5.021150 sec.)
//future.cancel
//  InterruptedException! (5.024899 sec.)

int remainingCapacity ()

理想的な状態(メモリーやリソースの制限がない状態)で、この両端キューがブロックせずに受け入れることができる追加要素の数を返します。

final var deque = new LinkedBlockingDeque<String>(3);

System.out.println(deque); // []
System.out.println(deque.remainingCapacity()); // 3

System.out.println(deque.offerLast("aaa")); // true

System.out.println(deque); // [aaa]
System.out.println(deque.remainingCapacity()); // 2

System.out.println(deque.offerLast("bbb")); // true

System.out.println(deque); // [aaa, bbb]
System.out.println(deque.remainingCapacity()); // 1

System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]
System.out.println(deque.remainingCapacity()); // 0

deque.clear();

System.out.println(deque); // []
System.out.println(deque.remainingCapacity()); // 3

E remove ()

この両端キューが表すキューの先頭を取得して削除します。

このメソッドは removeFirst() と同等です。
API使用例はそちらをご参照ください。

boolean remove (Object o)

指定された要素のうち最初に出現したものを、この両端キューから削除します。

このメソッドは removeFirstOccurrence(Object o) と同等です。
API使用例はそちらをご参照ください。

boolean removeAll (Collection<?> c)

指定されたコレクションにも格納されているこのコレクションのすべての要素を削除します(オプションの操作)。

final var src = List.of("a", "b", "a", "b", "A", "B");
System.out.println(src); // [a, b, a, b, A, B]

{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.removeAll(List.of())); // false
    System.out.println(deque); // [a, b, a, b, A, B]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.removeAll(List.of("a"))); // true
    System.out.println(deque); // [b, b, A, B]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.removeAll(List.of("a", "b"))); // true
    System.out.println(deque); // [A, B]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.removeAll(List.of("b", "a"))); // true
    System.out.println(deque); // [A, B]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.removeAll(List.of("A"))); // true
    System.out.println(deque); // [a, b, a, b, B]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.removeAll(List.of("X", "Y", "Z"))); // false
    System.out.println(deque); // [a, b, a, b, A, B]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.removeAll(List.of("A", "X", "Y", "Z"))); // true
    System.out.println(deque); // [a, b, a, b, B]
}

E removeFirst ()

この両端キューの最初の要素を取得して削除します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.removeFirst()); // aaa
System.out.println(deque); // [bbb, ccc]

System.out.println(deque.removeFirst()); // bbb
System.out.println(deque); // [ccc]

System.out.println(deque.removeFirst()); // ccc
System.out.println(deque); // []

try {
    deque.removeFirst();
} catch (NoSuchElementException e) {
    System.out.println("NoSuchElementException!");
}

// 結果
// ↓
//NoSuchElementException!

boolean removeFirstOccurrence (Object o)

指定された要素のうち最初に出現したものを、この両端キューから削除します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("BBB")); // true
System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("BBB")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, BBB, aaa, BBB, ccc]

System.out.println(deque.removeFirstOccurrence("aaa")); // true
System.out.println(deque); // [BBB, aaa, BBB, ccc]

System.out.println(deque.removeFirstOccurrence("BBB")); // true
System.out.println(deque); // [aaa, BBB, ccc]

System.out.println(deque.removeFirstOccurrence("XXX")); // false
System.out.println(deque); // [aaa, BBB, ccc]

boolean removeIf (Predicate<? super E> filter)

指定された述語を満たすこのコレクションの要素をすべて削除します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("BBB")); // true
System.out.println(deque.offerLast("ccc")); // true
System.out.println(deque.offerLast("DDD")); // true

System.out.println(deque); // [aaa, BBB, ccc, DDD]

final var ret = deque.removeIf(s -> {
    // 大文字であるかチェックします。
    return s.equals(s.toUpperCase());
});

System.out.println(ret); // true
System.out.println(deque); // [aaa, ccc]
final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true

System.out.println(deque); // [aaa, bbb]

final var ret = deque.removeIf(s -> s.equals(s.toUpperCase()));

System.out.println(ret); // false
System.out.println(deque); // [aaa, bbb]

E removeLast ()

この両端キューの最後の要素を取得して削除します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

System.out.println(deque.removeLast()); // ccc
System.out.println(deque); // [aaa, bbb]

System.out.println(deque.removeLast()); // bbb
System.out.println(deque); // [aaa]

System.out.println(deque.removeLast()); // aaa
System.out.println(deque); // []

try {
    deque.removeLast();
} catch (NoSuchElementException e) {
    System.out.println("NoSuchElementException!");
}

// 結果
// ↓
//NoSuchElementException!

boolean removeLastOccurrence (Object o)

指定された要素のうち最後に出現したものを、この両端キューから削除します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("BBB")); // true
System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("BBB")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, BBB, aaa, BBB, ccc]

System.out.println(deque.removeLastOccurrence("BBB")); // true
System.out.println(deque); // [aaa, BBB, aaa, ccc]

System.out.println(deque.removeLastOccurrence("aaa")); // true
System.out.println(deque); // [aaa, BBB, ccc]

System.out.println(deque.removeLastOccurrence("XXX")); // false
System.out.println(deque); // [aaa, BBB, ccc]

boolean retainAll (Collection<?> c)

このコレクションにおいて、指定されたコレクションに格納されている要素だけを保持します(オプションの操作)。

final var src = List.of("a", "b", "a", "b", "A", "B");
System.out.println(src); // [a, b, a, b, A, B]

{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.retainAll(List.of())); // true
    System.out.println(deque); // []
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.retainAll(List.of("a", "b"))); // true
    System.out.println(deque); // [a, b, a, b]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.retainAll(List.of("b", "a"))); // true
    System.out.println(deque); // [a, b, a, b]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.retainAll(List.of("A"))); // true
    System.out.println(deque); // [A]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.retainAll(List.of("X", "Y", "Z"))); // true
    System.out.println(deque); // []
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.retainAll(List.of("A", "X", "Y", "Z"))); // true
    System.out.println(deque); // [A]
}
{
    final var deque = new LinkedBlockingDeque<>(src);
    System.out.println(deque); // [a, b, a, b, A, B]

    System.out.println(deque.retainAll(List.of("a", "b", "A", "B"))); // false
    System.out.println(deque); // [a, b, a, b, A, B]
}

int size ()

この両端キュー内の要素の数を返します。

final var deque = new LinkedBlockingDeque<String>();
System.out.println(deque); // []
System.out.println(deque.size()); // 0

System.out.println(deque.offerLast("aaa")); // true

System.out.println(deque); // [aaa]
System.out.println(deque.size()); // 1

System.out.println(deque.offerLast("bbb")); // true

System.out.println(deque); // [aaa, bbb]
System.out.println(deque.size()); // 2

System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]
System.out.println(deque.size()); // 3

Spliterator<E> spliterator ()

この両端キュー内の要素に対するSpliteratorを返します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("aaa")); // true
System.out.println(deque.offerLast("bbb")); // true
System.out.println(deque.offerLast("ccc")); // true

System.out.println(deque); // [aaa, bbb, ccc]

final var spliterator = deque.spliterator();

System.out.println("-- forEachRemaining --");
spliterator.forEachRemaining(value -> {
    System.out.println("value = " + value);
});

// 結果
// ↓
//-- forEachRemaining --
//value = aaa
//value = bbb
//value = ccc

E take ()

この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得して削除します。必要に応じて、要素が利用可能になるまで待機します。

このメソッドは takeFirst() と同等です。
API使用例はそちらをご参照ください。

E takeFirst ()

この両端キューの最初の要素を取得して削除します。必要に応じて、要素が利用可能になるまで待機します。

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>();

    final var future = executor.submit(() -> {
        try {
            while (true) {
                System.out.println("  take ...");
                final var value = deque.takeFirst();

                System.out.printf("  take OK! : value = %s (%f sec.)%n",
                        value, elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.println("  InterruptedException!");
        }
    });

    System.out.printf("put values (%f sec.)%n", elapsedTime.getAsDouble());

    deque.putLast("aaa");
    deque.putLast("bbb");
    deque.putLast("ccc");

    TimeUnit.SECONDS.sleep(5);

    System.out.printf("put values (%f sec.)%n", elapsedTime.getAsDouble());

    deque.putLast("XXX");
    deque.putLast("YYY");
    deque.putLast("ZZZ");

    TimeUnit.SECONDS.sleep(5);

    System.out.println("future.cancel");
    future.cancel(true);
}

// 結果
// ↓
//put values (0.002803 sec.)
//  take ...
//  take OK! : value = aaa (0.004257 sec.)
//  take ...
//  take OK! : value = bbb (0.004373 sec.)
//  take ...
//  take OK! : value = ccc (0.004504 sec.)
//  take ...
//put values (5.005572 sec.)
//  take OK! : value = XXX (5.005799 sec.)
//  take ...
//  take OK! : value = YYY (5.005917 sec.)
//  take ...
//  take OK! : value = ZZZ (5.006012 sec.)
//  take ...
//future.cancel
//  InterruptedException!

E takeLast ()

この両端キューの最後の要素を取得して削除します。必要に応じて、要素が利用可能になるまで待機します。

// 基準となる時刻
final long current = System.nanoTime();

// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var deque = new LinkedBlockingDeque<String>();

    System.out.printf("put values (%f sec.)%n", elapsedTime.getAsDouble());

    deque.putLast("aaa");
    deque.putLast("bbb");
    deque.putLast("ccc");

    final var future = executor.submit(() -> {
        try {
            while (true) {
                System.out.println("  take ...");
                final var value = deque.takeLast();

                System.out.printf("  take OK! : value = %s (%f sec.)%n",
                        value, elapsedTime.getAsDouble());
            }
        } catch (InterruptedException e) {
            System.out.println("  InterruptedException!");
        }
    });

    TimeUnit.SECONDS.sleep(5);

    System.out.printf("future.cancel (%f sec.)%n", elapsedTime.getAsDouble());
    future.cancel(true);
}

// 結果
// ↓
//put values (0.001486 sec.)
//  take ...
//  take OK! : value = ccc (0.005003 sec.)
//  take ...
//  take OK! : value = bbb (0.005162 sec.)
//  take ...
//  take OK! : value = aaa (0.005336 sec.)
//  take ...
//future.cancel (5.019323 sec.)
//  InterruptedException!

Object[] toArray ()

両端キュー内のすべての要素を適切な順序(最初の要素から最後の要素へ)で格納している配列を返します。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("a")); // true
System.out.println(deque.offerLast("b")); // true
System.out.println(deque.offerLast("c")); // true

System.out.println(deque); // [a, b, c]

final Object[] array = deque.toArray();
System.out.println(Arrays.toString(array)); // [a, b, c]

<T> T[] toArray (T[] a)

両端キュー内のすべての要素を適切な順序で含む配列を返します。返される配列の実行時の型は、指定された配列の型になります。

final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("a")); // true
System.out.println(deque.offerLast("b")); // true
System.out.println(deque.offerLast("c")); // true

System.out.println(deque); // [a, b, c]

final String[] array = deque.toArray(new String[0]);
System.out.println(Arrays.toString(array)); // [a, b, c]
final var deque = new LinkedBlockingDeque<String>();

System.out.println(deque.offerLast("a")); // true
System.out.println(deque.offerLast("b")); // true
System.out.println(deque.offerLast("c")); // true

System.out.println(deque); // [a, b, c]

{
    final String[] array = new String[3];
    System.out.println(Arrays.toString(array)); // [null, null, null]

    final var ret = deque.toArray(array);
    System.out.println(Arrays.toString(array)); // [a, b, c]
    System.out.println(Arrays.toString(ret)); // [a, b, c]
}
{
    final String[] array = new String[5];
    System.out.println(Arrays.toString(array)); // [null, null, null, null, null]

    final var ret = deque.toArray(array);
    System.out.println(Arrays.toString(array)); // [a, b, c, null, null]
    System.out.println(Arrays.toString(ret)); // [a, b, c, null, null]
}
{
    final String[] array = new String[1];
    System.out.println(Arrays.toString(array)); // [null]

    final var ret = deque.toArray(array);
    System.out.println(Arrays.toString(array)); // [null]
    System.out.println(Arrays.toString(ret)); // [a, b, c]
}

AbstractCollectionで宣言されたメソッド

containsAll, isEmpty, toString

Java API 使用例 : AbstractCollection」をご参照ください。

Collectionで宣言されたメソッド

containsAll, equals, hashCode, isEmpty, parallelStream, stream, toArray

Java API 使用例 : Collection」をご参照ください。


関連記事

ページの先頭へ