在内部类中访问for循环变量

6

我有一个整数的数组数组。

DataArray[X][Y]

我希望为每个X创建一个线程,该线程沿着Y进行迭代。我无法弄清楚如何将适当的X值传递给每个线程。
基本上,我想要做到以下事情:
ExecutorService threadPool = Executors.newFixedThreadPool(10);
for (int i = 0; i < X; i++) {
  threadPool.submit(new Runnable() {
    public void run() {         
      Function_to_run(i);
    }
  });
}

非常感谢您的提问,我们很乐意为您提供帮助。


我想为每个X创建一个线程,该线程沿着Y进行迭代。您能详细说明一下您的意思吗? - Chetan Kinger
目前我有一个函数,它沿着数组的Y维度进行操作,并且对于每个X值都会调用一次。我希望这个操作可以并发执行,而不是使用for循环。 - cpri
我猜你的代码没有编译通过?看看我的答案。 - Chetan Kinger
你应该考虑使用ForkJoinPool来完成这个任务。 - David Ehrmann
2个回答

8

只有 final 值可以在方法局部匿名内部类中被引用。您需要按照以下方式更改代码:

for (int i = 0; i < X; i++) {
        final int index = i;
        threadPool.submit(new Runnable() {
             public void run() {

                  Function_to_run(index);

         }
     });

这似乎已经生效了;我会进行一些测试。 - cpri
@user1908455 好的,请告诉我如果它没有起作用。如果它起作用了,请不要忘记打勾并点赞 :) - Chetan Kinger
为什么这个能够工作?在循环中,final 变量不应该在第二次迭代时引发异常吗?你不能给已经初始化的 final 变量赋予新值。变量 index 并没有超出作用域。 - scottb
@scottb 在循环的每一次迭代中都会创建一个新的index变量。index的作用域仅限于迭代。 - Chetan Kinger
@ChetanKinger:也许是这样,尽管我不知道任何JVM目前支持尾递归。如果没有这样的支持,那么您是否建议每次迭代都加载新的堆栈帧?当然不可能,因为循环具有大量迭代次数时不会导致堆栈溢出异常。 - scottb
显示剩余2条评论

0

任何在内部类中使用但未声明的局部变量、形式方法参数或异常处理程序参数都必须声明为final。任何在内部类中使用但未声明的局部变量都必须在内部类的主体之前被明确定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接