33sこのとき1,3,5はIO処理がメインでCPUはほとんど使っていません。無駄が多いことになります。非同期の場合はどうでしょう。非同期処理を始めること自体はゼロコストではないため、ファイルの読み取り開始自体は1sかかると想定します。読み取りはバックグラウンドで行われ、メイン側のCPU資源は使わない(または、無視できるほど小さい)とします。(11sに完了)Bの読み取り開始。(3sに完了)Cの読み取り開始。(8sに完了)完了したBを処理する。8s完了したCを処理する。13s完了したAを処理する。24s途中の5.で待ちがありましたが、9sの短縮になりました。これは単純なモデルですが、同時に処理したいIOが多数あり、それぞれの処理時間がバラバラというときは上記よりももっと効率的に動作する場合があります。おまけでマルチスレッドによる並列にした同期処理を見てみましょう。CPU資源は1つのみだが、IO処理はバックグラウンドで並列可能とします。スレッド自体の開始も1sとします。コンテキストスイッチは1s毎に動作し、0コストであると仮定します。[メイン]A用のスレッド開始。1s[メイン]B用のスレッド開始。2s[A]Aの読み取り(1/10)[メイン]C用のスレッド開始。23s[メイン]合計する。24sトータル時間は非同期と変わらないように見えますが、実際はこれにコンテキストスイッチによる負荷が発生します。1sあたり0.1sほど負荷があるとしても、24s*1.1=26.4sです。このコンテキストスイッチによる負荷の大きさが非同期との大きな違いです。上は単純でかつ恣意的なモデルですので、計算モデルの取り方によっては全く異なる可能性もあります。複数CPUが搭載されている場合、Javaではマルチスレッドで並列化した方が計算資源を効率よく使えるかも知れませんが、PythonやRubyではGIL(GVL)の効果でほぼ無意味かも知れません。同期処理と非同期処理、シングルスレッドとマルチスレッド、それらを比較したい場合は、純粋な計算処理ではなく、ファイルの読み取りやWebアクセスと言ったIO処理を混ぜた場合にどうなるかを見てみると、どういうときに効果的かというのが見えてくると思います。|この質問に回答するには、ログインする必要があります。求めていた回答ではありませんか?javajava8非同期のタグが付いた他の質問を参照する。FatJarのビルドについて1プログラミング(javaのクラス)について質問があります。0Javaからmysqlコマンドを実行し、結果をファイルに書き出したい。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。従って情報を開示できることに同意したことになります。選択した項目のみ受け入れる。