在另一个类中传递非最终整数

时间:2015-03-12 19:08:48

标签: java multithreading for-loop integer final

我有这个问题:我想使用for循环一次执行多个线程。我想将变量“i”传递给线程中的方法。但是发生了一个错误,我无法将非最终变量“i”传递给另一个类。我该如何解决这个问题?这是我的代码:

for (int i = 0; i < 4; i++) { // 4 THREADS AT ONCE
  thread[i] = new Thread() {
    public void run() {
      randomMethod(i); // ERROR HERE
    }
  };
  thread[i].start();
}

3 个答案:

答案 0 :(得分:4)

试试这个

for (int i = 0; i < 4; i++) { // 4 THREADS AT ONCE
  final int temp=i;
  thread[i] = new Thread() {
    public void run() {
      randomMethod(temp); // ERROR HERE
    }
  };
  thread[i].start();
}

答案 1 :(得分:1)

您可以使用类似于以下内容的代码:

public class MyRunnable implements Runnable {
    private int i;

    public MyRunnable(int i) {
        this.i = i;
    }

    public void run() {
        randomMethod(i); 
    }
}

// In another class
...
for (int i = 0; i < 4; i++) { // 4 THREADS AT ONCE
    thread[i] = new Thread(new MyRunnable(i));
}
thread[i].start();
...

答案 2 :(得分:1)

如前所述,有很多方法可以解决这个问题,但重要的是要知道错误发生的原因。

这是因为Java在此类中创建了匿名类中使用的最终变量的副本。如果此变量不是最终变量,则无法保证您始终拥有此变量的正确(最新)版本。所以,你不能在匿名类声明中使用任何非最终局部变量(因为Java 8实际上是最终的就足够了)。