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 ()
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)
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)
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)
// 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)
// 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)
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)
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)
このメソッドは offerLast(E e) と同等です。
API使用例はそちらをご参照ください。
boolean offer (E e, long timeout, TimeUnit unit)
このメソッドは offerLast(E e, long timeout, TimeUnit unit) と同等です。
API使用例はそちらをご参照ください。
boolean offerFirst (E e)
// 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)
// 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 ()
このメソッドは peekFirst() と同等です。
API使用例はそちらをご参照ください。
E peekFirst ()
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 ()
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 ()
このメソッドは pollFirst() と同等です。
API使用例はそちらをご参照ください。
E poll (long timeout, TimeUnit unit)
このメソッドは pollFirst(long timeout, TimeUnit unit) と同等です。
API使用例はそちらをご参照ください。
E pollFirst ()
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 ()
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)
このメソッドは 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 ()
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」をご参照ください。
関連記事
- API 使用例
- BlockingQueue (ブロッキング・キュー)
- Callable
- CancellationException
- ConcurrentHashMap.KeySetView (並列処理用セット)
- ConcurrentLinkedDeque (並列処理用・両端キュー)
- ConcurrentLinkedQueue (並列処理用キュー)
- ConcurrentMap (並列処理用マップ)
- ConcurrentModificationException (並列処理例外)
- ConcurrentSkipListSet (並列処理用セット)
- Condition (同期)
- CopyOnWriteArrayList (並列処理用リスト)
- CopyOnWriteArraySet (並列処理用セット)
- CountDownLatch (同期)
- CyclicBarrier (同期)
- Exchanger (同期)
- Executor
- ExecutorService
- Executors
- Future
- Future.State
- FutureTask
- InterruptedException (割込み例外)
- Lock (同期)
- Object (オブジェクト)
- Runnable
- Semaphore (セマフォ)
- Thread (スレッド)
- ThreadGroup
- ThreadLocal
- TimeUnit