私は、私のプログラムが実行中に約 500 のスレッドを作成するプロジェクトに取り組んできました。プログラムを実行するとすぐに、PC に大きな負荷がかかり始めることがわかりました。また、スレッドの 75% がジョブを完了した後も負荷が表示され続けます。作業が終了したスレッドが強制終了されたかどうかを知りたいです。そして、Java はジョブを終了したスレッドをどのように処理しますか。何か助け...
5 に答える
プログラムを実行するとすぐに、PC に大きな負荷がかかり始めることがわかりました。また、スレッドの 75% がジョブを完了した後も負荷が表示され続けます。
500 スレッドの 75% がジョブを完了した場合、100 以上のスレッドが引き続き実行されます。十分な量の CPU を使用している場合、100 個のスレッドは、100 個のコアがないと思われるボックスのプロセッサを圧倒する可能性があります。したがって、実行中のスレッドの数がコアの数を下回るまで、アプリケーションは 100% の CPU 使用率を示し続ける可能性があります。
500 の同時スレッドを作成する代わりに、固定サイズのスレッド プールを使用することを検討する必要があります。次に、500 個のタスクをスレッド プールに送信します。これにより、同時に実行する適切な数のスレッドを選択できます。スレッドの適切な数は、サブミットされるタスクに大きく依存します。より多くの CPU バウンド タスクはより少ないスレッドを使用する必要がありますが、IO バウンド タスクはより多くのスレッドを使用できます。値を最適化するには、スレッド数を調整しながらアプリケーションでテストを実行するのが最善の方法です。私はコア数の 2 倍から始めて、そこから最適化する傾向があります。
// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// define your jobs somehow
for (MyRunnable job : jobsToDo) {
threadPool.submit(job);
}
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
詳細については、ExecutorService
チュートリアルをご覧ください。
作業が終了したスレッドが強制終了されたかどうかを知りたいです。そして、Java はジョブを終了したスレッドをどのように処理しますか。何か助け...
スレッドはおそらく終了しています。スレッドがrun()
メソッドを離れた後 (例外を返すか、例外をスローするため)、スレッドは CPU を消費しなくなり、基になるネイティブ スレッドを取得または再利用できます。オブジェクトへの参照がない場合Thread
、そのメモリは最終的にガベージ コレクターによって取得されます。
Thread
JVM は、オブジェクトへの参照がなく、その run メソッドが返される限り、オブジェクトをガベージ コレクションします。run メソッドが戻った後、スレッド自体が死んでいます。まだヒープにあるかもしれませんが、独自のスタックを持たず、何もしません。
スレッドが強制終了されていない唯一の可能性は、スレッドがまだ何かを実行しているか、スレッド オブジェクトへの参照をクリーンアップするのを忘れていることですが、これはメモリに関連しています。
スレッド プールを介してスレッドを割り当てた場合、それらはタスクの実行後にプールに返されます。この場合、タスクの完了後に解放されない可能性があります。
スレッドのライフサイクルについて読むことができます。run メソッドが終了した場合、CPU を消費していないはずです。
タスクを達成するために多くのスレッドを作成しないでください。OutofMemoryError などの多くの問題が発生します。また、スレッドの作成はコストのかかる作業であるため、スレッドプール、つまりExecutorService
同じスレッドを何度も再利用することを考える必要があります。
ただし、スレッドが作成された後に質問に答える方法はすべて、自動的に終了します。つまり、ガベージコレクションが行われるため、何もする必要はありません。当初、Java はstop()
orのようなメソッドを提供しdestroy()
ていましたが、これらは正当な理由で非推奨になっています。
Threads who have finished their jobs will die. It won't consume any more CPU time.
You can use jstack
to check how many threads are active running in your java process.