0

メソッドが新しいスレッドで実行されるとrun()、独自のスタックが作成されます。countdownメインスレッドからの変数 (この場合のように) は、別のスタックで run メソッドによってどのようにアクセスされますか?

final CountDownLatch countdown = new CountDownLatch(1);
for (int i = 0; i < 10; ++ i) {
   Thread racecar = new Thread() {    
      public void run()    {
         countdown.await(); //all threads waiting
         System.out.println("Vroom!");
      }
   };
   racecar.start();
}
System.out.println("Go");
countdown.countDown();
4

3 に答える 3

3

各スレッドには独自のスタックがありますが、同じヒープをプログラムの残りの部分と共有します。その場合、run()メソッドは外部クラスの匿名内部クラスにあるため、通常のクラスと変数のスコープが適用され、そのホスト クラスのメンバーにアクセスできます。

countdown変数がスタックにプッシュされていません。パラメータとしてメソッドに渡された場合、スタックにプッシュされます。

于 2013-09-25T14:13:51.353 に答える
3

スタック上の変数は、スレッドに対してローカルです。スタックとスレッドは、CPU によるネイティブ レベルでのサポートであり、Java の詳細ではありません。

ただし、あなたの例でcountdownは、作成した Thread のサブクラスのフィールドにコピーされるため、スタックローカル変数ではなく、オブジェクトのフィールドです。(実際には何も持っていないようです)

バイトコードでは、スタックを使用する場合がありますが、最適化されると、スタックをまったく使用しない可能性が高くなります。代わりにレジスタが使用されます。

于 2013-09-25T14:15:34.457 に答える
1

匿名の内部オブジェクトには、裏で囲んでいるクラスへの参照が与えられます。

この件に関する優れたJon Skeetの回答については、こちらを参照してください。

于 2013-09-25T14:11:04.183 に答える