[解決済み] ExecutorCompletionService? invokeAll があるのに、なぜ必要なのですか?
質問
を使用する場合
エグゼキュータコンプリートサービス
として、一連のタスクを送信することができます。
Callable
と対話しながら結果を得ることができます。
CompletionService
として
queue
.
しかし、そこには
invokeAll
の
ExecutorService
を受け付ける。
Collection
のリストが得られます。
Future
を使用して結果を取得します。
私の知る限り、どちらを使っても利点はありません。
for
ループを使用し
invokeAll
にしなければならないことを
submit
へのタスクは
CompletionService
) と、本質的には同じ考えですが、若干の違いがあります。
では、なぜ一連のタスクの投入に2種類の方法があるのでしょうか?性能的には同等ということでいいのでしょうか?一方が他方より適しているケースはあるのでしょうか?思いつきません。
解決方法は?
を使用することで
ExecutorCompletionService.poll/take
を受信していることになります。
Future
を完了順に(多かれ少なかれ)表示します。使用方法
ExecutorService.invokeAll
すべて完了するまでブロックするか、タイムアウトを指定して未完了をキャンセルする必要があります。
static class SleepingCallable implements Callable<String> {
final String name;
final long period;
SleepingCallable(final String name, final long period) {
this.name = name;
this.period = period;
}
public String call() {
try {
Thread.sleep(period);
} catch (InterruptedException ex) { }
return name;
}
}
さて、以下では、どのように
invokeAll
が動作します。
final ExecutorService pool = Executors.newFixedThreadPool(2);
final List<? extends Callable<String>> callables = Arrays.asList(
new SleepingCallable("quick", 500),
new SleepingCallable("slow", 5000));
try {
for (final Future<String> future : pool.invokeAll(callables)) {
System.out.println(future.get());
}
} catch (ExecutionException | InterruptedException ex) { }
pool.shutdown();
これにより、次のような出力が得られます。
C:\dev\scrap>java CompletionExample
... after 5 s ...
quick
slow
使用方法
CompletionService
のように、異なる出力が表示されます。
final ExecutorService pool = Executors.newFixedThreadPool(2);
final CompletionService<String> service = new ExecutorCompletionService<String>(pool);
final List<? extends Callable<String>> callables = Arrays.asList(
new SleepingCallable("slow", 5000),
new SleepingCallable("quick", 500));
for (final Callable<String> callable : callables) {
service.submit(callable);
}
pool.shutdown();
try {
while (!pool.isTerminated()) {
final Future<String> future = service.take();
System.out.println(future.get());
}
} catch (ExecutionException | InterruptedException ex) { }
これにより、次のような出力が得られます。
C:\dev\scrap>java CompletionExample
... after 500 ms ...
quick
... after 5 s ...
slow
時間は、前のメッセージではなく、プログラム開始からの相対時間であることに注意してください。
完全なコードは、両者で確認することができます。 ここで .
関連
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] ArrayListの初期化を1行で行う。
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:'if'のない'else'エラー
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】Javaを包含するクラスではないのか?
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。
-
[解決済み】CreateProcess error=2, The system cannot find file specified.
-
[解決済み】ExecutorServiceを使用して、すべてのスレッドが終了するのを待つにはどうすればよいですか?