0

Javaにすでに存在するプロジェクト(非マルチスレッドプロジェクト)にマルチスレッドプラットフォームを開発し始めています。パフォーマンスGAINが必要であり、プロジェクト全体で行われる複雑な計算の時間を短縮できます。

私はエグゼキュータを使用していますが、それがThreadGroupまたは純粋なRunnableと比較してパフォーマンス向上のための最良のソリューションであるかどうかは本当にわかりません。

では、どちらを使用する必要がありますか?

4

2 に答える 2

5

スレッドプールを複数の計算に再利用した場合にのみ、パフォーマンスが向上します(つまり、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スレッドプール(エグゼキュータ)もRunnablesで機能するため、純粋な(純粋なスレッドかもしれませんか?)という意味がわかりません。

于 2012-08-30T12:49:11.343 に答える
3

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();
于 2012-08-30T12:49:35.190 に答える