Javaにすでに存在するプロジェクト(非マルチスレッドプロジェクト)にマルチスレッドプラットフォームを開発し始めています。パフォーマンスGAINが必要であり、プロジェクト全体で行われる複雑な計算の時間を短縮できます。
私はエグゼキュータを使用していますが、それがThreadGroupまたは純粋なRunnableと比較してパフォーマンス向上のための最良のソリューションであるかどうかは本当にわかりません。
では、どちらを使用する必要がありますか?
Javaにすでに存在するプロジェクト(非マルチスレッドプロジェクト)にマルチスレッドプラットフォームを開発し始めています。パフォーマンスGAINが必要であり、プロジェクト全体で行われる複雑な計算の時間を短縮できます。
私はエグゼキュータを使用していますが、それがThreadGroupまたは純粋なRunnableと比較してパフォーマンス向上のための最良のソリューションであるかどうかは本当にわかりません。
では、どちらを使用する必要がありますか?
スレッドプールを複数の計算に再利用した場合にのみ、パフォーマンスが向上します(つまり、100回ごとに10スレッドを開始するのではなく、10スレッドでプールを開始して10タスクを100回実行します)。彼らはまだ起動するために最初のオーバーヘッドを取ります、あなたはこの部分を逃れることができません。だからここに例があります:
ExecutorService exec = Executors.newFixedThreadPool(10);
for(int i = 0; i < 10; i++) {
exec.submit(new Task(i));
}
// later
for(int i = 0; i < 10; i++) {
exec.submit(new Task(i));
}
exec.shutdown(); // etc.
この場合、最初に10スレッドを開始するオーバーヘッドを1回だけ支払います。
純粋なスレッドの使用:
List<Thread> threads = new ArrayList<Thread>();
for(int i = 0; i < 10; i++) {
Thread t = new Thread(new Task(i));
threads.add(t);
t.start();
}
for(Thread t: threads) {
t.join();
}
// later I need more work
threads = new ArrayList<Thread>();
for(int i = 0; i < 10; i++) {
Thread t = new Thread(new Task(i));
threads.add(t);
t.start();
}
for(Thread t: threads) {
t.join();
}
この場合、10スレッドを2回開始するオーバーヘッドを支払います。これは、スレッドの不適切な使用法です。もちろん、これらのタスクを1回だけ実行する必要がある場合は、エグゼキュータでの作業が簡単であることを除いて、パフォーマンスに違いはありません。
Runnable
スレッドプール(エグゼキュータ)もRunnable
sで機能するため、純粋な(純粋なスレッドかもしれませんか?)という意味がわかりません。
ThreadGroup
スレッドを整理する方法であり、ほとんど使用されません。
Executors
「純粋」を取るので、あなたはあなた自身のスレッドをフォークするRunnable
ことと比較するつもりだったと思いますか?Executors
これらのソリューションはどちらも、パフォーマンスの向上という点では似ていますが、ExecutorService
クラスは非常に簡単に使用できます。Runnable
プールに与えるスレッドの数に応じて、並行して実行される一連のクラスを送信できます。
本当の秘訣は、作業を、フォークしたスレッドまたはスレッドプールを介して並行して実行できるジョブに分割することです。
Executors
:を含む一般的なコードパターン
// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// or you can create an open-ended thread pool
// ExecutorService threadPool = Executors.newCachedThreadPool();
// submit my jobs which are classes that implement Runnable
for (MyRunnable myRunnable : myRunnables) {
threadPool.submit(myRunnable);
}
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();