2015-03-12 1 views
1

У меня есть эта проблема: я хочу выполнить сразу несколько потоков, используя for-loop. Я хочу передать переменную «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(); 
} 
+8

Создайте переменную 'final' внутри цикла, которая инициализируется значением' i', и передайте это вместо этого. –

+0

@HuStmpHrrr, нет, этого будет недостаточно, вы не можете изменить значение конечной переменной! –

+0

Вам не нужно его менять? Просто "final int k = i;" и передать k вместо i. Или создайте не анонимный подкласс класса и передайте i его конструктору. – JHH

ответ

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(); 
} 
+0

@NeerajJain Это неправда. Объявление переменной внутри цикла и присвоение 'i' будет работать. –

+1

@MintyFresh, и что я делаю прямо сейчас ??? –

+0

@MintyFresh Вы его код Неераджа? –

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(); 
... 
1

Как уже упоминалось, существует довольно много способов решения эта проблема, но важно знать, ПОЧЕМУ возникает ошибка.

Это потому, что Java создает копию конечной переменной, используемой в анонимном классе для этого класса. Если эта переменная не является окончательной, нет никакой гарантии, что у вас всегда будет правая (новейшая) версия этой переменной. Итак, вы не можете использовать какие-либо не конечные локальные переменные в объявлении анонимного класса (так как достаточно эффективного завершения Java 8).

Смежные вопросы