Java : BlockingDeque (ブロッキング・両端キュー) - API使用例
BlockingDeque (Java SE 20 & JDK 20) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
要素の取得時に両端キューが空でなくなるまで待機したり、要素の格納時に両端キュー内に空きが生じるまで待機するブロック操作を追加でサポートしたりするDequeです。
BlockingDeque インタフェースは、
- 要素を取り出すときに、もし空だったら要素が追加されるまで待機
という操作が可能な Deque です。
// 基準となる時刻
final long current = System.nanoTime();
// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;
try (final var executor = Executors.newSingleThreadExecutor()) {
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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.002596 sec.)
// take ...
// take OK! : value = aaa (0.004495 sec.)
// take ...
// take OK! : value = bbb (0.004650 sec.)
// take ...
// take OK! : value = ccc (0.004762 sec.)
// take ...
//put values (5.012578 sec.)
// take OK! : value = XXX (5.012909 sec.)
// take ...
// take OK! : value = YYY (5.013045 sec.)
// take ...
// take OK! : value = ZZZ (5.013141 sec.)
// take ...
//future.cancel
// InterruptedException!
メソッド
boolean add (E e)
指定された要素を、この両端キューで表されるキュー(つまり、この両端キューの末尾)に、容量制限に違反することなしにすぐに挿入できる場合には、そうします。成功した場合はtrueを返し、使用可能な空き領域がその時点で存在しない場合はIllegalStateExceptionをスローします。
このメソッドは addLast(E e) と同等です。
API使用例はそちらをご参照ください。
void addFirst (E e)
容量制限に違反することなく指定された要素をこの両端キューの先頭にすぐに挿入できる場合には、そうします。使用可能な空き領域がその時点で存在しない場合はIllegalStateExceptionをスローします。
// capacity = 3
final BlockingDeque<String> deque = new LinkedBlockingDeque<>(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 BlockingDeque<String> deque = new LinkedBlockingDeque<>(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
boolean contains (Object o)
指定された要素がこの両端キューに含まれている場合にtrueを返します。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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
E element ()
この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得しますが、削除しません。
このメソッドは getFirst() と同等です。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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!
Iterator<E> iterator ()
この両端キュー内の要素を適切な順序で反復処理するイテレータを返します。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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(System.out::println);
// 結果
// ↓
//-- forEachRemaining --
//aaa
//bbb
//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 BlockingDeque<String> deque = new LinkedBlockingDeque<>(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)
指定された要素をこの両端キューの先頭に挿入します。必要に応じて、指定された待機時間まで空きが生じるのを待機します。
// 基準となる時刻
final long current = System.nanoTime();
// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;
try (final var executor = Executors.newSingleThreadExecutor()) {
final BlockingDeque<String> deque = new LinkedBlockingDeque<>(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.001915 sec.)
// offer ...
// offer ret = true (0.004569 sec.)
// offer ...
// offer ret = true (0.004718 sec.)
// offer ...
// offer ret = true (0.004860 sec.)
// offer ...
// offer ret = false (5.006397 sec.)
//deque = [ccc, bbb, aaa] (10.004461 sec.)
boolean offerLast (E e)
容量制限に違反することなしに指定された要素をこの両端キューの末尾にすぐに挿入できる場合には、そうします。成功した場合はtrueを返し、使用可能な空き領域がその時点で存在しない場合はfalseを返します。
// capacity = 3
final BlockingDeque<String> deque = new LinkedBlockingDeque<>(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)
指定された要素をこの両端キューの末尾に挿入します。必要に応じて、指定された待機時間まで空きが生じるのを待機します。
// 基準となる時刻
final long current = System.nanoTime();
// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;
try (final var executor = Executors.newSingleThreadExecutor()) {
final BlockingDeque<String> deque = new LinkedBlockingDeque<>(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.001915 sec.)
// offer ...
// offer ret = true (0.004569 sec.)
// offer ...
// offer ret = true (0.004718 sec.)
// offer ...
// offer ret = true (0.004860 sec.)
// offer ...
// offer ret = false (5.006397 sec.)
//deque = [aaa, bbb, ccc] (10.007953 sec.)
E peek ()
この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得しますが、削除しません。両端キューが空の場合は、nullを返します。
このメソッドは peekFirst() と同等です。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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 poll ()
この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得および削除します。両端キューが空の場合は、nullを返します。
このメソッドは pollFirst() と同等です。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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 poll (long timeout, TimeUnit unit)
この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得して削除します。必要に応じて、指定された待機時間まで要素が利用可能になるのを待機します。
このメソッドは pollFirst(long timeout, TimeUnit unit) と同等です。
API使用例はそちらをご参照ください。
E pollFirst (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 BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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.002583 sec.)
// poll ...
// poll value = aaa (0.003982 sec.)
// poll ...
// poll value = bbb (0.004155 sec.)
// poll ...
// poll value = ccc (0.004282 sec.)
// poll ...
// poll value = null (5.007742 sec.)
// poll ...
//future.cancel
// InterruptedException!
E pollLast (long timeout, TimeUnit unit)
この両端キューの最後の要素を取得して削除します。必要に応じて、指定された待機時間まで要素が利用可能になるのを待機します。
// 基準となる時刻
final long current = System.nanoTime();
// 基準となる時刻からの差分を秒として取得
final DoubleSupplier elapsedTime = () -> (System.nanoTime() - current) / 1000000000.0;
try (final var executor = Executors.newSingleThreadExecutor()) {
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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.002719 sec.)
// poll ...
// poll value = ccc (0.004141 sec.)
// poll ...
// poll value = bbb (0.004277 sec.)
// poll ...
// poll value = aaa (0.004409 sec.)
// poll ...
// poll value = null (5.006775 sec.)
// poll ...
//future.cancel
// InterruptedException!
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 BlockingDeque<String> deque = new LinkedBlockingDeque<>(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.002041 sec.)
// put ...
// put OK! (0.004570 sec.)
// put ...
// put OK! (0.004671 sec.)
// put ...
// put OK! (0.004771 sec.)
// put ...
//deque = [ccc, bbb, aaa] (5.018881 sec.)
//future.cancel
// InterruptedException! (5.019745 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 BlockingDeque<String> deque = new LinkedBlockingDeque<>(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.001776 sec.)
// put ...
// put OK! (0.004289 sec.)
// put ...
// put OK! (0.004391 sec.)
// put ...
// put OK! (0.004498 sec.)
// put ...
//deque = [aaa, bbb, ccc] (5.007701 sec.)
//future.cancel
// InterruptedException! (5.008613 sec.)
E remove ()
この両端キューによって表されるキューの先頭(つまり、この両端キューの最初の要素)を取得して削除します。
このメソッドは removeFirst() と同等です。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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 remove (Object o)
指定された要素のうち最初に出現したものを、この両端キューから削除します。
このメソッドは removeFirstOccurrence(Object o) と同等です。
API使用例はそちらをご参照ください。
boolean removeFirstOccurrence (Object o)
指定された要素のうち最初に出現したものを、この両端キューから削除します。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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 removeLastOccurrence (Object o)
指定された要素のうち最後に出現したものを、この両端キューから削除します。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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]
int size ()
この両端キュー内の要素の数を返します。
final BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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
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 BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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.002596 sec.)
// take ...
// take OK! : value = aaa (0.004495 sec.)
// take ...
// take OK! : value = bbb (0.004650 sec.)
// take ...
// take OK! : value = ccc (0.004762 sec.)
// take ...
//put values (5.012578 sec.)
// take OK! : value = XXX (5.012909 sec.)
// take ...
// take OK! : value = YYY (5.013045 sec.)
// take ...
// take OK! : value = ZZZ (5.013141 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 BlockingDeque<String> deque = new LinkedBlockingDeque<>();
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.002098 sec.)
// take ...
// take OK! : value = ccc (0.004629 sec.)
// take ...
// take OK! : value = bbb (0.004766 sec.)
// take ...
// take OK! : value = aaa (0.004897 sec.)
// take ...
//future.cancel (5.011561 sec.)
// InterruptedException!
BlockingQueueで宣言されたメソッド
drainTo, drainTo, remainingCapacity
「Java API 使用例 : BlockingQueue」をご参照ください。
Collectionで宣言されたメソッド
clear, containsAll, equals, hashCode, isEmpty, parallelStream, removeAll, removeIf, retainAll, spliterator, stream, toArray, toArray, toArray
「Java API 使用例 : Collection」をご参照ください。
Dequeで宣言されたメソッド
addAll, descendingIterator, getFirst, getLast, peekFirst, peekLast, pollFirst, pollLast, pop, removeFirst, removeLast
「Java API 使用例 : Deque」をご参照ください。
Iterableで宣言されたメソッド
forEach
「Java API 使用例 : Iterable」をご参照ください。
関連記事
- API 使用例
- BlockingQueue (ブロッキング・キュー)
- Callable
- CancellationException
- ConcurrentHashMap.KeySetView (並列処理用セット)
- ConcurrentLinkedDeque (並列処理用・両端キュー)
- ConcurrentLinkedQueue (並列処理用キュー)
- ConcurrentMap (並列処理用マップ)
- ConcurrentModificationException (並列処理例外)
- ConcurrentSkipListSet (並列処理用セット)
- Condition (同期)
- CopyOnWriteArrayList (並列処理用リスト)
- CopyOnWriteArraySet (並列処理用セット)
- CountDownLatch (同期)
- CyclicBarrier (同期)
- Exchanger (同期)
- ExecutionException
- Executor
- ExecutorService
- Executors
- Future
- Future.State
- FutureTask
- InterruptedException (割込み例外)
- Lock (同期)
- Object (オブジェクト)
- Runnable
- Semaphore (セマフォ)
- Thread (スレッド)
- ThreadGroup
- ThreadLocal
- TimeUnit