広告

Java : PriorityBlockingQueue (ブロッキング・優先度付きキュー) - API使用例

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


概要

クラスPriorityQueueと同じ順序付けルールを使用するとともにブロッキング取得オペレーションを提供する、制限なしのブロッキング・キューです。 このキューは論理的にはアンバウンド形式ですが、追加を試みてもリソース不足によりOutOfMemoryErrorが発生して失敗することがあります。

クラス構成

PriorityBlockingQueue は、

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

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

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

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

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

    final var queue = new PriorityBlockingQueue<String>();

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

                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());

    queue.put("aaa");
    queue.put("bbb");
    queue.put("ccc");

    TimeUnit.SECONDS.sleep(5);

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

    queue.put("XXX");
    queue.put("YYY");
    queue.put("ZZZ");

    TimeUnit.SECONDS.sleep(5);

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

// 結果
// ↓
//put values (0.002364 sec.)
//  take ...
//  take OK! : value = aaa (0.004022 sec.)
//  take ...
//  take OK! : value = bbb (0.004228 sec.)
//  take ...
//  take OK! : value = ccc (0.004420 sec.)
//  take ...
//put values (5.009203 sec.)
//  take OK! : value = XXX (5.009556 sec.)
//  take ...
//  take OK! : value = YYY (5.009790 sec.)
//  take ...
//  take OK! : value = ZZZ (5.009974 sec.)
//  take ...
//future.cancel
//  InterruptedException!

また、PriorityBlockingQueue クラスの要素は、自然順序 もしくは Comparator によってソートされます。
ただし、キューの取得操作である pollremove, peek, take 以外 … 例えば、iteratortoArray などは、ソートされていることは保証されません。

record Item(String value, int priority) {
    @Override
    public String toString() {
        return "%s(%d)".formatted(value, priority);
    }
}

final var comparator = Comparator.comparingInt(Item::priority);

final var queue = new PriorityBlockingQueue<Item>(11, comparator);
System.out.println(queue); // []

System.out.println(queue.offer(new Item("aaa", 1))); // true
System.out.println(queue.offer(new Item("bbb", 2))); // true
System.out.println(queue.offer(new Item("ccc", 3))); // true
System.out.println(queue.offer(new Item("XXX", 100))); // true
System.out.println(queue.offer(new Item("YYY", 99))); // true
System.out.println(queue.offer(new Item("ZZZ", 98))); // true

System.out.println(queue); // [aaa(1), bbb(2), ccc(3), XXX(100), YYY(99), ZZZ(98)]

System.out.println(queue.poll()); // aaa(1)
System.out.println(queue.poll()); // bbb(2)
System.out.println(queue.poll()); // ccc(3)
System.out.println(queue.poll()); // ZZZ(98)
System.out.println(queue.poll()); // YYY(99)
System.out.println(queue.poll()); // XXX(100)

コンストラクタ

PriorityBlockingQueue ()

自然順序付けに従って要素を順序付けする、デフォルトの初期容量(11)を持つPriorityBlockingQueueを作成します。

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

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

PriorityBlockingQueue (int initialCapacity)

自然順序付けに従って要素を順序付けする、指定された初期容量を持つPriorityBlockingQueueを作成します。

初期容量(initialCapacity) を変えて処理時間を計った例です。
(実行する環境によって変わる可能性があります)

final var queue = new PriorityBlockingQueue<Integer>(10000000);
System.out.println(queue); // []

final var startTime = System.nanoTime();

for (int i = 0; i < 4000000; i++) {
    queue.add(i);
}

final var endTime = System.nanoTime();

// 0.197829 sec.
System.out.printf("%f sec.%n", (endTime - startTime) / 1000000000.0);
final var queue = new PriorityBlockingQueue<Integer>(1);
System.out.println(queue); // []

final var startTime = System.nanoTime();

for (int i = 0; i < 4000000; i++) {
    queue.add(i);
}

final var endTime = System.nanoTime();

// 0.262046 sec.
System.out.printf("%f sec.%n", (endTime - startTime) / 1000000000.0);

initialCapacity と remainingCapacity() の 容量 は、意味が異なるでご注意ください。

final var queue = new PriorityBlockingQueue<Integer>(100);
System.out.println(queue.remainingCapacity()); // 2147483647

PriorityBlockingQueue (int initialCapacity, Comparator<? super E> comparator)

指定されたコンパレータに従って要素を順序付けする、指定された初期容量を持つPriorityBlockingQueueを作成します。

initialCapacity パラメータについては PriorityBlockingQueue(int initialCapacity) の使用例をご参照ください。

record Item(String value, int priority) {
    @Override
    public String toString() {
        return "%s(%d)".formatted(value, priority);
    }
}

final var comparator = Comparator.comparingInt(Item::priority);

final var queue = new PriorityBlockingQueue<Item>(11, comparator);
System.out.println(queue); // []

System.out.println(queue.offer(new Item("aaa", 1))); // true
System.out.println(queue.offer(new Item("bbb", 2))); // true
System.out.println(queue.offer(new Item("ccc", 3))); // true
System.out.println(queue.offer(new Item("XXX", 100))); // true
System.out.println(queue.offer(new Item("YYY", 99))); // true
System.out.println(queue.offer(new Item("ZZZ", 98))); // true

System.out.println(queue); // [aaa(1), bbb(2), ccc(3), XXX(100), YYY(99), ZZZ(98)]

System.out.println(queue.poll()); // aaa(1)
System.out.println(queue.poll()); // bbb(2)
System.out.println(queue.poll()); // ccc(3)
System.out.println(queue.poll()); // ZZZ(98)
System.out.println(queue.poll()); // YYY(99)
System.out.println(queue.poll()); // XXX(100)

PriorityBlockingQueue (Collection<? extends E> c)

指定されたコレクション内の要素を含むPriorityBlockingQueueを作成します。

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

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

メソッド

boolean add (E e)

指定された要素をこの優先度キューに挿入します。

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

System.out.println(queue.add("aaa")); // true
System.out.println(queue); // [aaa]

System.out.println(queue.add("bbb")); // true
System.out.println(queue); // [aaa, bbb]

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

void clear ()

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

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

System.out.println(queue.offer("a")); // true
System.out.println(queue); // [a]

System.out.println(queue.offer("b")); // true
System.out.println(queue); // [a, b]

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

Comparator<? super E> comparator ()

このキュー内の要素を順序付けするのに使うコンパレータを返します。ただし、このキューがその要素の自然順序付けを使う場合はnullを返します。

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

final var comparator = queue.comparator();
System.out.println(comparator); // null
final var queue = new PriorityBlockingQueue<String>(11, Comparator.reverseOrder());
System.out.println(queue); // []

final var comparator = queue.comparator();
System.out.println(Objects.equals(comparator, Comparator.reverseOrder())); // true
final var queue = new PriorityBlockingQueue<>(11, String.CASE_INSENSITIVE_ORDER);
System.out.println(queue); // []

final var comparator = queue.comparator();
System.out.println(Objects.equals(comparator, String.CASE_INSENSITIVE_ORDER)); // true

boolean contains (Object o)

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

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

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

int drainTo (Collection<? super E> c)

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

final var queue = new PriorityBlockingQueue<String>();
final var c = new ArrayList<String>();

System.out.println(queue.offer("aaa")); // true

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

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

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

System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

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

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

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

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

final var queue = new PriorityBlockingQueue<String>();
final var c = new ArrayList<String>();

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

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

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

System.out.println(queue.offer("XXX")); // true
System.out.println(queue.offer("YYY")); // true
System.out.println(queue.offer("ZZZ")); // true

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

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

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

void forEach (Consumer<? super E> action)

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

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

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

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

Iterator<E> iterator ()

このキュー内の要素のイテレータを返します。

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

final var iterator = queue.iterator();

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

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

boolean offer (E e)

指定された要素をこの優先度キューに挿入します。

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

System.out.println(queue.offer("aaa")); // true
System.out.println(queue); // [aaa]

System.out.println(queue.offer("bbb")); // true
System.out.println(queue); // [aaa, bbb]

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

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

指定された要素をこの優先度キューに挿入します。

関連:offer(E e)

キューの容量は無制限のため、timeout および unit パラメータは無視されます。

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

System.out.println(queue.offer("aaa", 10, TimeUnit.SECONDS)); // true
System.out.println(queue); // [aaa]

System.out.println(queue.offer("bbb", 10, TimeUnit.SECONDS)); // true
System.out.println(queue); // [aaa, bbb]

E peek ()

キューの先頭を取得しますが、削除しません。キューが空の場合はnullを返します。

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

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

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

System.out.println(queue.peek()); // bbb
System.out.println(queue); // [bbb, ccc]

System.out.println(queue.poll()); // bbb
System.out.println(queue); // [ccc]

System.out.println(queue.peek()); // ccc
System.out.println(queue); // [ccc]

System.out.println(queue.poll()); // ccc
System.out.println(queue); // []

System.out.println(queue.peek()); // null
System.out.println(queue); // []

E poll ()

キューの先頭を取得および削除します。キューが空の場合はnullを返します。

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

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

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

System.out.println(queue.poll()); // bbb
System.out.println(queue); // [ccc]

System.out.println(queue.poll()); // ccc
System.out.println(queue); // []

System.out.println(queue.poll()); // null
System.out.println(queue); // []

E poll (long timeout, TimeUnit unit)

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

関連:poll()

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

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

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

    final var queue = new PriorityBlockingQueue<String>();

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

                System.out.printf("  poll 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());

    queue.put("aaa");
    queue.put("bbb");
    queue.put("ccc");

    TimeUnit.SECONDS.sleep(8);

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

// 結果
// ↓
//put values (0.002233 sec.)
//  poll ...
//  poll value = aaa (0.003545 sec.)
//  poll ...
//  poll value = bbb (0.003715 sec.)
//  poll ...
//  poll value = ccc (0.003865 sec.)
//  poll ...
//  poll value = null (5.013690 sec.)
//  poll ...
//future.cancel
//  InterruptedException!

void put (E e)

指定された要素をこの優先度キューに挿入します。

キューの容量は無制限のため、このメソッドはブロックされません。

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

queue.put("aaa");
System.out.println(queue); // [aaa]

queue.put("bbb");
System.out.println(queue); // [aaa, bbb]

int remainingCapacity ()

PriorityBlockingQueueは容量制約を受けないため、常にInteger.MAX_VALUEを返します。

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

final var capacity = queue.remainingCapacity();
System.out.println(capacity); // 2147483647
System.out.println(capacity == Integer.MAX_VALUE); // true

System.out.println(queue.offer("aaa")); // true

System.out.println(queue); // [aaa]
System.out.println(queue.remainingCapacity()); // 2147483647

System.out.println(queue.offer("bbb")); // true

System.out.println(queue); // [aaa, bbb]
System.out.println(queue.remainingCapacity()); // 2147483647

boolean remove (Object o)

指定された要素の単一のインスタンスがこのキューに存在する場合は、キューから削除します。

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

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

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

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

System.out.println(queue.remove("XXX")); // false
System.out.println(queue); // [aaa, ccc]

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 queue = new PriorityBlockingQueue<>(src);
    System.out.println(queue); // [A, a, B, b, b, a]

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

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

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

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

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

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

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

boolean removeIf (Predicate<? super E> filter)

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

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("BBB")); // true
System.out.println(queue.offer("ccc")); // true
System.out.println(queue.offer("DDD")); // true

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

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

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

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true

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

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

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

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 queue = new PriorityBlockingQueue<>(src);
    System.out.println(queue); // [A, a, B, b, b, a]

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

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

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

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

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

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

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

int size ()

このコレクション中の要素の数を返します。

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue); // []
System.out.println(queue.size()); // 0

System.out.println(queue.offer("aaa")); // true

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

System.out.println(queue.offer("bbb")); // true

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

System.out.println(queue.offer("ccc")); // true

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

queue.clear();

System.out.println(queue); // []
System.out.println(queue.size()); // 0

Spliterator<E> spliterator ()

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

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue.offer("aaa")); // true
System.out.println(queue.offer("bbb")); // true
System.out.println(queue.offer("ccc")); // true

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

final var spliterator = queue.spliterator();

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

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

E take ()

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

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

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

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

    final var queue = new PriorityBlockingQueue<String>();

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

                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());

    queue.put("aaa");
    queue.put("bbb");
    queue.put("ccc");

    TimeUnit.SECONDS.sleep(5);

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

    queue.put("XXX");
    queue.put("YYY");
    queue.put("ZZZ");

    TimeUnit.SECONDS.sleep(5);

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

// 結果
// ↓
//put values (0.002364 sec.)
//  take ...
//  take OK! : value = aaa (0.004022 sec.)
//  take ...
//  take OK! : value = bbb (0.004228 sec.)
//  take ...
//  take OK! : value = ccc (0.004420 sec.)
//  take ...
//put values (5.009203 sec.)
//  take OK! : value = XXX (5.009556 sec.)
//  take ...
//  take OK! : value = YYY (5.009790 sec.)
//  take ...
//  take OK! : value = ZZZ (5.009974 sec.)
//  take ...
//future.cancel
//  InterruptedException!

Object[] toArray ()

このキューの要素がすべて含まれている配列を返します。

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue.offer("a")); // true
System.out.println(queue.offer("b")); // true
System.out.println(queue.offer("c")); // true

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

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

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

このキュー内のすべての要素を含む配列を返します。返される配列の実行時の型は、指定された配列の型です。

final var queue = new PriorityBlockingQueue<String>();

System.out.println(queue.offer("a")); // true
System.out.println(queue.offer("b")); // true
System.out.println(queue.offer("c")); // true

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

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

System.out.println(queue.offer("a")); // true
System.out.println(queue.offer("b")); // true
System.out.println(queue.offer("c")); // true

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

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

    final var ret = queue.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 = queue.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 = queue.toArray(array);
    System.out.println(Arrays.toString(array)); // [null]
    System.out.println(Arrays.toString(ret)); // [a, b, c]
}

AbstractQueueで宣言されたメソッド

addAll, element, remove

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

AbstractCollectionで宣言されたメソッド

containsAll, isEmpty, toString

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

Collectionで宣言されたメソッド

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

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

Queueで宣言されたメソッド

element, remove

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


関連記事

ページの先頭へ