当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();
答案 0 :(得分:3)
虽然每个线程都有自己的堆栈,但它与程序的其余部分共享同一个堆。
正则类和变量作用域适用于该情况,因为run()
方法位于外部类的匿名内部类中,因此它可以访问其主机类的成员。
countdown
变量未被压入堆栈。如果它作为参数传递给方法,那么它将被推入堆栈。
答案 1 :(得分:3)
堆栈上的变量是线程的本地变量。堆栈和线程由CPU支持本机级别,而不是Java的详细信息。
但是,在您的示例中,countdown
被复制到您创建的Thread子类的字段中,因此它是对象的字段,而不是堆栈局部变量。 (事实上你似乎没有)
在字节代码中,它可以使用堆栈,但一旦优化,很可能它根本不会使用堆栈。而是使用寄存器。
答案 2 :(得分:1)