私はJavaを使用してGUIを作成しています(そうではありませんか?)。Swing Workerクラスを使用すると、バックグラウンドでの計算が可能になり、GUIがハングするのを防ぐことができますが、ここで良いことが多すぎるのではないかと思っていました...
たとえば、実行中のバックグラウンドスレッドのインスタンスが多すぎる場合、コンピューターによってはプログラムのパフォーマンスに影響しますか?単純ですが重要な質問です。ご意見をいただければ幸いです。御時間ありがとうございます。
私はJavaを使用してGUIを作成しています(そうではありませんか?)。Swing Workerクラスを使用すると、バックグラウンドでの計算が可能になり、GUIがハングするのを防ぐことができますが、ここで良いことが多すぎるのではないかと思っていました...
たとえば、実行中のバックグラウンドスレッドのインスタンスが多すぎる場合、コンピューターによってはプログラムのパフォーマンスに影響しますか?単純ですが重要な質問です。ご意見をいただければ幸いです。御時間ありがとうございます。
コードを詳しく調べると、次の定数が定義されているSwingWorker
ことがわかります。
/**
* number of worker threads.
*/
private static final int MAX_WORKER_THREADS = 10;
SwingWorker
したがって、実際に作成する の数に関係なく、バックグラウンド スレッドの数がこの値を超えることはありません。
バックグラウンド スレッド モデルを変更する 1 つの方法は、クラスExecutorService
にAppContext
関連付けられた に独自のものをプラグインすることです。ただし、これは公式の JDK API に属しているため、公式の JDK API の一部ではないため、SwingWorker
少し危険です。AppContext
sun.awt
// Create single thread executor to force all background tasks to run on the same thread.
ExecutorService execService = Executors.newSingleThreadExecutor();
// Retrieve the AppContext. *CAUTION*: This is part of the sun.awt package.
AppContext ctxt = AppContext.getAppContext();
// Verify that nothing is already associated with SwingWorker.class within the context.
Object obj = ctxt.get(SwingWorker.class);
if (obj != null) {
throw new IllegalStateException("Object already associated with SwingWorker: " + obj);
}
// Install ExecutorService. Will be retrieved by the SwingWorker when execute() is called.
ctxt.put(SwingWorker.class, ctxt);
はい、当然のことながら、より多くの処理を行うと、コンピューターのパフォーマンスに影響を与えます。結局のところ、処理リソースは有限のリソースです。
とはいえ、最近の多くのコンピューターには複数のコアが搭載されているため、シングルスレッド アプリケーションではプロセッサ リソースを十分に活用できない可能性があります。
一般に、いくつかのスレッドを実行することは大きな問題にはなりません。ただし、スレッドが数百または数千になると、パフォーマンスが低下する可能性があります。これは、スレッド間のコンテキスト切り替えにかかる時間が、使用可能な処理リソースの大部分を占有し始める可能性があるためです。
持っているコアの数によって異なります。たとえば、2 つのコアがある場合、1 つのバックグラウンド タスクを安全に生成できます。1 つは UI 用、もう 1 つはタスク用の 2 つのスレッドを生成するためです。スレッドは 2 つのコア間で適切に分割されます。
ただし、UI タスクはアイドル状態 (ユーザーが何かを行うのを待っている) であることがよくあります。したがって、99% のケースで、2 コアのマシンでは (常に存在する標準の UI スレッドに加えて) 2 つのワーカー スレッドを生成できます。