Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何运行不同线程的方法访问变量?_Java_Multithreading - Fatal编程技术网

Java 如何运行不同线程的方法访问变量?

Java 如何运行不同线程的方法访问变量?,java,multithreading,Java,Multithreading,当run方法在新线程中运行时,它将有自己的堆栈。在本例中,run方法在不同堆栈中访问的主线程中的变量(如倒计时)如何 final CountDownLatch countdown = new CountDownLatch(1); for (int i = 0; i < 10; ++ i) { Thread racecar = new Thread() { public void run() { countdown.await(); //al

当run方法在新线程中运行时,它将有自己的堆栈。在本例中,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();

匿名内部对象被提供了一个对幕后封闭类的引用


请参阅,以获得关于该主题的最佳答案。

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


未将倒计时变量推送到堆栈上。如果它是作为参数传递给方法的,那么它将被推送到堆栈上。

堆栈上的变量是线程的本地变量。堆栈和线程由CPU在本机级别提供支持,而不是Java的细节

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


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

你是在问JVM的内部结构吗?有没有任何答案可以让我对内存管理有一个想法。我不会说深入的答案,但是,是的,有一些方向或链接。你是说每个新线程都会引用存储在堆中的倒计时变量?它是如何作为参数传递的?这就是它不作为参数传递的点,所以它不在堆栈上。堆栈只保留了调用哪些方法调用和传递哪些参数的记录,以便按相反的顺序“弹出”。另一方面,当一个新的匿名类被实例化时,它会在幕后提供它正在操作的额外上下文信息,比如承载匿名类实例的对象的成员变量。实际上不是这样。倒计时对象的引用当然存储在堆栈或寄存器中,尽管这是一个实现细节。发生的事情是,内部类获取要在幕后传递的地址倒计时点。这个实现也是变量必须是final的原因——在类创建之后,后面的倒计时赋值不会有任何效果。真正的闭包确实会在堆上创建某种包装器,但遗憾的是,java中没有这种包装器。如果无法以字节码获取此语句,它可能会使用堆栈,但一旦优化,很可能根本不会使用堆栈。相反,寄存器是used@Niks真正的计算机有寄存器,这些寄存器不仅比访问堆栈快得多,许多操作只使用寄存器工作。因此,可以通过简单的方法调用优化堆栈的使用。