如何运行方法访问不同Thread的变量?

时间:2013-09-25 14:08:23

标签: java multithreading

run()方法在新线程中运行时,它将拥有自己的堆栈。如何在不同堆栈中由run方法访问的主线程中的变量(在本例中为countdown)?

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();

3 个答案:

答案 0 :(得分:3)

虽然每个线程都有自己的堆栈,但它与程序的其余部分共享同一个堆。 正则类和变量作用域适用于该情况,因为run()方法位于外部类的匿名内部类中,因此它可以访问其主机类的成员。

countdown变量未被压入堆栈。如果它作为参数传递给方法,那么它将被推入堆栈。

答案 1 :(得分:3)

堆栈上的变量是线程的本地变量。堆栈和线程由CPU支持本机级别,而不是Java的详细信息。

但是,在您的示例中,countdown被复制到您创建的Thread子类的字段中,因此它是对象的字段,而不是堆栈局部变量。 (事实上​​你似乎没有)

在字节代码中,它可以使用堆栈,但一旦优化,很可能它根本不会使用堆栈。而是使用寄存器。

答案 2 :(得分:1)

匿名内部对象被赋予对幕后封闭类的引用。

请参阅here,了解有关该主题的优秀Jon Skeet答案。