6

長時間の計算を行うプログラムがあるので、そのパフォーマンスを高速化したいと思います。そのため、現時点では3つのスレッドを起動しようとしましたが、CPU使用率の25%を占めており(つまり、1つのCPUのみが使用されています) 、リアルタイムで使用して優先度を設定java.exeしようとしても残ります(24)。使ってみましたが、動作がさらに遅いようです。各スレッドが1つのプロセッサに割り当てられ、合計CPU使用率が75%に増加した場合は完璧ですが、その方法がわかりません。そして、それが私のコードが今どのように見えるかです:.setPriority(Thread.MAX_PRIORITY);java.exeRealtimeThread

Thread g1 = new MyThread(i,j);
g1.setPriority(Thread.MAX_PRIORITY);
g1.run();
Thread g2 = new MyThread(j,i);
g2.setPriority(Thread.MAX_PRIORITY);
g2.run();
Thread g3 = new MyThread(i,j);
g3.setPriority(Thread.MAX_PRIORITY);
g3.run();
if (g1.isAlive()) {
        g1.join();
}
if (g2.isAlive()) {
        g2.join();
}
if (g3.isAlive()) {
        g3.join();
}
4

3 に答える 3

23

実際にはスレッドを使用していません。

.start()ではなく、を呼び出す必要があります.run()

于 2012-05-08T21:48:47.013 に答える
11

これはCPUとは何の関係もありません。実際には3つのスレッドを開始しているのではなく、すべてをメインスレッドで実行しています。スレッドを開始するにはstart()、ではなくそのメソッドを呼び出しますrun()

于 2012-05-08T21:49:35.390 に答える
6

まず、他の人が示唆しているように、実際には複数のスレッドを使用していません。これは、run()メソッドを呼び出しているためです。このメソッドは、呼び出し元のスレッドで作業を行うことになります。

ここで、残りの質問に対処します。これは、マルチスレッドプロセスの効率を最大化する方法を意味します。これは簡単な質問ではありませんが、基本を説明します。(その他、お気軽にチャイムを鳴らしてください。)

プロセスの効率を最大化するための最良の方法は、すべてのスレッドにほぼ同じ量の作業を行わせ、それらがブロックされないようにすることです。つまり、アプリケーションを効率的に実行するために、ワークロードの「バランスをとる」のはあなたの仕事です。

一般に、特定のCPUコアで実行するスレッドを割り当てることはできません。これは通常、OSとCPU自体の仕事です。OSは(指定した優先順位を使用して)プロセスをスケジュールし、CPUは命令レベルで独自のスケジュールを実行できます。優先順位を設定する以外に、残りのスケジュールは完全に制御できません。

編集:私はセミコロンにはまっています。

于 2012-05-08T21:53:33.710 に答える