2016-02-12 3 views
1

Я искал похожие вопросы, но они не были связаны с циклами. У меня есть следующий код:Как передать индексную переменную цикла for в анонимный поток/Runnable

image = new BufferedImage[maxFiles]; 
    for (int i = 0; i < maxFiles; i++) { 
     new Thread(){ 
      public void run() {     
       try { 
        file = new File("0" + i + ".jpg"); 
        image[i] = ImageIO.read(file); 
       } catch (IOException e) {e.printStackTrace();} 
      } 
     }; 
    } 

Как вы можете видеть, что я хочу, чтобы загрузить каждый файл изображения на своем собственном потоке, чтобы оптимизировать немного. К сожалению, переменная i цикла for не может быть передана по методу , и я не могу сделать его окончательным или статическим. Как бы вы решили это?

+0

из любопытства, сколько файлов это 'maxFiles'? Одновременное создание неограниченного количества потоков - это плохая идея. Вы считали, что вместо этого используете _thread pool_? –

ответ

5

У вас может быть конечная переменная с тем же значением.

image = new BufferedImage[maxFiles]; 
for (int i = 0; i < maxFiles; i++) { 
    final int index = i; 
    new Thread(){ 
     public void run() {     
      try { 
       file = new File("0" + index + ".jpg"); 
       image[index] = ImageIO.read(file); 
      } catch (IOException e) {e.printStackTrace();} 
     } 
    }; 
} 

Возможно, вы также захотите начать свои темы.

+0

Вы удивительно правы; Интересно, был ли лучший способ вместо инициализации ** maxFiles ** int переменных ... это, по-видимому, просто ошибка языка, и да, я забыл написать вызов run() здесь. – mmalkavian

+0

@mmalkavian Вы хотите вызвать 'start()', а не 'run()'. Нет смысла писать что-то как «Thread», если вы собираетесь называть 'run()' на нем. – khelwood

0

В дополнение к @ khelwood, решение которого вы также можете использовать переменные экземпляра в анонимных классов:

for (int i = 0; i < maxFiles; i++) { 
     new Thread() { 
      // Capture i here. 
      int index = i; 

      public void run() { 
       try { 
        file = new File("0" + index + ".jpg"); 
        image[index] = ImageIO.read(file); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
    } 
+0

Это не работает, потому что код в анонимном классе не разрешается ссылаться на нефинал 'i'. –

+0

@James большой. Он может получить доступ к индексу. – OldCurmudgeon

+0

Проблемная строка: 'int index = i;' Это не будет компилироваться. Я пытался. –

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