我有这个问题:我想使用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();
}
答案 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实际上是最终的就足够了)。