2

私はマルチスレッドでこれを読んでいました: http://www.ntu.edu.sg/home/ehchua/programming/java/j5e_multithreading.html

シングル コア CPU の CPU 集中型タスクにを追加することをお勧めします(必須ではありません)Thread.sleep(10) 。これを効果的に行うことで、CPU が持つ他のすべてのスレッド (そして最も重要なことに、UI私が改善しようとしているプログラムの)。

これは私には意味がありません。私のプログラムは応答しませんが、コンピューターの残りの部分は正常に動作しており、各プログラムに割り当てられた CPU 時間を Windows が与えていると思います。

とにかく、これは良いアドバイスですか?もしそうなら、私は「ここに他のスレッドのための10ミリ秒のボーナスがあります」と言っていますか、それともThread.sleep(0)うまくいきますか?

4

2 に答える 2

4

これは 2004 年にさかのぼる記事 (JDK5 の新機能を参照しているため) に対する良いアドバイスだと思います。最初のデュアル コア プロセッサは 2006 年に登場しました。 .

アプリが利用可能なすべてのコアをロードする場合、今日同じ手法を適用できると思います。記事の例では、この実行時間の長いアクションは、譲歩せずにスレッド プールにドロップできると思います。

アップデート

スレッドの生成は環境に大きく依存します: yield()、sleep(0)、wait(0,1)、parkNanos(1)

短時間待機したい場合、これらすべてのメソッドが同じことを行うとは想定できず、プラットフォーム間で同じになるとは限りません。

于 2013-11-10T08:30:51.483 に答える
2

これは、Windows でのスリープによってメイン スレッドが一時停止され、バックグラウンド スレッドが処理される時代からの明らかに古いアドバイスです。古いスレッド化の概念はキューとして想像でき、フロント スレッドだけが処理時間を取得します。そのスレッドが保留になるとすぐに (Windows では sleep(1) で十分です)、現在のスレッドはキューの最後に置かれ、他のスレッドが処理されます。

ただし、最新の OS ではこれがまったく異なる方法で処理され、そのアドバイスは現在、マルチスレッドの不適切な実装の兆候です。Java には、スレッドの優先度を設定するオプションがあり、バックグラウンド スレッドを負荷の高い処理に簡単に使用できます。今日は、次のように実装します。

まず、優先度の低いスレッド用の ThreadFactory が必要です。

public class PriorityThreadFactory implements ThreadFactory {

  protected final ThreadGroup allThreads;

  public PriorityThreadFactory(final String name, final int priority, final boolean daemon) {
    this.allThreads = new ThreadGroup(name);
    this.allThreads.setMaxPriority(priority);
    this.allThreads.setDaemon(daemon);
  }

  @Override
  public Thread newThread(final Runnable r) {
    return new Thread(this.allThreads, r);
  }
}

次に ExecutorService を作成し、優先度を次のように設定しますThread.MIN_PRIORITY

final PriorityThreadFactory threadFactory = new PriorityThreadFactory("workers", Thread.MIN_PRIORITY, true);
final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), threadFactory);

最後に、任意の数のタスクを送信できます。タスクはバックグラウンドで処理され、UI スレッドなどの重要なスレッドをブロックしません。

executor.submit(new MyWorkerTask());
于 2013-11-10T10:05:22.920 に答える