【问题标题】:Accessing a for loop variable inside an inner class访问内部类中的 for 循环变量
【发布时间】:2015-05-17 15:02:40
【问题描述】:

我有一个 int 数组。

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

任何帮助将不胜感激

【问题讨论】:

  • I would like to create a thread for each X, which iterates along Y你能详细说明你的意思吗?
  • 目前我有一个函数沿着数组的 Y 维度进行,并为每个 X 值调用。我希望这可以同时完成,而不是在 for 循环中。
  • 我假设你的代码没有编译?看我的回答。
  • 您应该考虑为此使用 ForkJoinPool。

标签: java arrays multithreading


【解决方案1】:

只有 final 值可以在方法本地匿名内部类中捕获。您需要按如下方式更改代码:

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

                  Function_to_run(index);

         }
     });

【讨论】:

  • 这似乎奏效了;会给它一些测试
  • @user1908455 好的。让我知道它是否不起作用。如果它确实有效,请不要忘记打勾并投票:)
  • 为什么会这样?循环中的final 变量不应该在第二次迭代中引发异常吗?您不能为已初始化的 final 变量分配新值。变量index 没有超出范围。
  • @scottb 为循环的每次迭代创建一个新的index 变量。 index 的范围仅限于一次迭代。
  • @ChetanKinger:我相信你,但我不明白为什么。 for 循环是否每次迭代都会创建一个新堆栈?如果没有,我看不出index 会超出范围。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 2018-05-24
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2016-05-07
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多