最近、私はJavaでマルチスレッドと非同期プログラミングを学んでいますが、これは紛らわしいと思いました。
私の質問を明確にするために:以下のコードは同等ですか?
いいえの場合、なぜですか?私の意見では、最初のスニペットでは、whileループは元のスレッドをビジー状態に保ちます(ブロッキングを意味しますか?)。
はいの場合、非同期を適切に使用する方法は?
//asynchronous programing
ExecutorService threadpool = Executors.newCachedThreadPool();
Future<Long> futureTask = threadpool.submit(() -> factorial(number));
while (!futureTask.isDone()) {
System.out.println("FutureTask is not finished yet...");
}
long result = futureTask.get();
threadpool.shutdown();
//synchronous
long result = factorial(number)
タスクを次々に実行する場合、非同期メソッドを使用することは実際には意味がありません。同期のオーバーヘッドが失われ、処理の終了を待つ必要があります。さらに、アクティブループを使用して終了を待機する場合:
while (!futureTask.isDone()) { // active wait loop
System.out.println("FutureTask is not finished yet...");
}
システムにさらに負荷を追加します。少なくともwait
、他の処理が終了するまで、現在のスレッドを一時停止モードにする方法を使用する必要があります。
ただし、とにかく、タスクを次々に実行する場合は、タスクを次々に同期的に呼び出すだけです。
factorial(number));
other processings...
これにより、パフォーマンスを低下させることなく、コードの保守がよりクリーンで簡単になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加