1

インターネットで次の例を見ました。

public class TwoThreads {
public static class Thread1 extends Thread {
    public void run() {
        System.out.println("A");
        System.out.println("B");
    }
}
public static class Thread2 extends Thread {
    public void run() {
        System.out.println("1");
        System.out.println("2");
    }
}
public static void main(String[] args) {
    new Thread1().start();
    new Thread2().start();
}

}


私の質問は:

  1. 「A」が「B」の前に出力され、「1」が「2」の前に出力されることは保証されていますが、「1」が別のスレッドによって 2 回連続して出力される可能性はありますか?少なくとも 3 つのスレッド (1 つのメインと 2 つの作成済み) があります。スケジューラーが 1 つのスレッドを実行すると想像できますか? new Thread1().start(); System.out.println("1"); の直後にあきらめました。次に、Thread1().start(); で別の脅威を再度実行します。「1」を再度出力しますか?

  2. 私は NetBeans IDE を使用しています。そのようなプログラムを実行すると、常に同じ最初の結果が得られるようです。そのため、キャッシュに何かがあるようです。私の理解では、揮発性変数を宣言することでそれを処理していますが、ここでどのように行うことができますか? そうでない場合、キャッシュの解決策は何ですか?

  3. 今日のコンピュータのプロセッサでは、ほとんどの場合 2 つのプロセッサが使用されていますが、ネット上の多くのマルチスレッド プログラムでは 2 つ以上のスレッドが使用されています。コンパイルに関しては、このプロセスは重く遅くなりませんか?

4

3 に答える 3

1

1) スレッドがどのような順序で進行するかは保証されません。

2) ただし、順序もランダム化されません。したがって、同じ (または非常に類似した) 条件でプログラムを実行すると、おそらく同じスレッド インターリーブが発生します。特定の動作 (ランダム化された動作を含む) が必要な場合は、自分で同期する必要があります。

3) 2 つのコアを備えた CPU は、同時に 2 つのスレッドしか実行できませんが、ほとんどのスレッドは、実際には CPU を使用せずに、I/O やユーザーの操作などを待機することにほとんどの時間を費やします。そのため、3 つ以上のスレッドを持つことで多くのメリットが得られます (同時に計算できるのは 2 つだけですが、同時に待機できるスレッドは数百あります)。node.js を見てみましょう。node.js は、マルチスレッド プログラミングの代替として最近人気があり、実行スレッドが 1 つだけでありながら、同時要求に対して優れたスループットを実現します。

于 2012-09-14T04:17:50.390 に答える
0

1/2の質問への回答:スレッドは並列コードを実行しますが、スレッドの実行メソッド内では常に順次実行されます。

あなたの3つの質問に答えてください。プロセッサの数=スレッドの数の場合のアプリケーションですが、スレッドが何らかのブロッキング操作を待機している場合、その間に別のスレッドが実行される可能性があるため、パフォーマンスが最適化されない可能性があるため、これは完全な真実ではありません。

于 2012-09-14T04:20:27.067 に答える
0
  1. いいえ。スレッドを同期しているわけではないため、正確な実行順序はスケジューラーに依存します。スレッドがどのように実装されているかを考えると、「1」(または「A」)を1つのスレッドで2回印刷する方法がわかりません。

  2. どのようなキャッシュですか?そして、どのような変数ですか?volatileサンプルコードには変数がないため、キーワードで使用するのに適切なものはありません。このプログラムを実行している特定のマシンでは、常に同じ結果が得られる可能性が非常に高くなります。#1で述べたように、あなたはスケジューラーに翻弄されています。スケジューラーが常に同じように動作する場合、常に同じ結果が得られます。キャッシングはそれとは何の関係もありません。

  3. それはスレッドが何をしているかに依存します。すべてのスレッドに1つのCPUコアを100%までロードするのに十分な作業がある場合、はい、CPUコアよりも多くのスレッドを持つことは無意味です。ただし、これは非常にまれです。多くのスレッドは、ほとんどの時間をスリープ状態にするか、I / Oが完了するのを待つか、CPUコアを完全にロードするのに十分な要求がないことを実行します。このような場合、CPUコアよりも多くのスレッドを使用しても問題はありません。実際、マルチスレッドは主流のマルチコアCPUよりも前から存在しており、CPUコアが1つしかなかった時代でも、複数のスレッドを使用できることは非常に有益でした。

于 2012-09-14T04:21:24.683 に答える