2015-09-22 4 views
2

Эта программа является окончательным назначением для моего класса, и у меня возникают проблемы с выяснением, почему я получаю ошибку. «Локальные переменные, на которые ссылается внутренний класс, должны быть окончательный или фактически окончательный ». Программа запускает параллельные потоки для сортировки массива из #, а затем находит высокие и низкие значения этого массива. Когда я создал его без параллелизма, у меня не было этой ошибки. Я борюсь за то, где можно завершить высокую и низкую переменную.Локальные переменные, на которые ссылается внутренний класс, должны быть окончательными или эффективными окончательными

public void HiLo(int[] numbers){ 

    int high = numbers[0]; 
    int low = numbers[0]; 

    Runnable r2 = new Runnable(){ 
     @Override 
     public void run() { 
      System.out.println("The highest value is: "); 
      for (int index = 1; index < numbers.length; index++){ 
       if (numbers[index] > high) 
        high = numbers[index]; 
       System.out.println(high); 
       } 
      System.out.println(); 
      System.out.println("The lowest value is: "); 
      for (int ind = 1; ind < numbers.length; ind++){ 
       if (numbers[ind] < low) 
        low = numbers[ind]; 
       System.out.println(low); 
      } 
     } 
    }; 
    pool.execute(r2); 
} 

Это блок кода, создающий ошибку. Если я делаю либо int high = numbers [0]; или int low = numbers [0]; final, то я получаю сообщение об ошибке, что я не могу сделать это значение окончательным, и ошибка для противоположной переменной исчезнет.

А дальше остальная часть программы. Любая помощь приветствуется.

package concurrentthread; 

import java.util.Arrays; 
import java.util.Scanner; 
import java.util.concurrent.Executor; 
import java.util.concurrent.Executors; 


public class ConcurrentThread { 

    static Executor pool = Executors.newFixedThreadPool(2); 

public static void main(String[] args) { 
    int size; 

    Scanner keyboard = new Scanner(System.in); 

    ConcurrentThread sort = new ConcurrentThread(); 
    ConcurrentThread hilo = new ConcurrentThread(); 

    System.out.println("This program will calculate the highest and lowest " 
       + "numbers entered by the user \nand also sort them in " 
       + "ascending order"); 
    System.out.println(); 
    System.out.print("How many numbers would you like in the array? "); 
     size = keyboard.nextInt(); 

    final int[] numbers = new int[size]; 

    for (int index = 0; index < numbers.length; index++){ 
     System.out.print("Please enter a number between 1 and 100: "); 
     numbers[index] = keyboard.nextInt(); 
    } 

    System.out.println(); 
    sort.Sort(numbers); 
    hilo.HiLo(numbers); 

    //System.exit(0); 
} 

public void Sort(int[] numbers){ 
    int sort = numbers[0]; 

    Runnable r1 =() -> { 
     Arrays.sort(numbers); 
     System.out.println("The sorted values are: "); 
     for (int index = 0; index < numbers.length; index++) 
      System.out.print(numbers[index] + " "); 

     System.out.println(); 
    }; 
    pool.execute(r1); 
} 

public void HiLo(int[] numbers){ 

    final int high = numbers[0]; 
    int low = numbers[0]; 

    Runnable r2 = new Runnable(){ 
     @Override 
     public void run() { 
      System.out.println("The highest value is: "); 
      for (int index = 1; index < numbers.length; index++){ 
       if (numbers[index] > high) 
        high = numbers[index]; 
       System.out.println(high); 
       } 
      System.out.println(); 
      System.out.println("The lowest value is: "); 
      for (int ind = 1; ind < numbers.length; ind++){ 
       if (numbers[ind] < low) 
        low = numbers[ind]; 
       System.out.println(low); 
      } 
     } 
    }; 
    pool.execute(r2); 
} 

}

ответ

5

Вы постоянно обновлять как high и low внутри метода run(), что делает их по определению не эффективно окончательной.

Так или иначе, вы не нуждаетесь в них вне метода run(), просто переместите две строки внутри.

public void HiLo(int[] numbers){ 

    Runnable r2 = new Runnable(){ 
     @Override 
     public void run() { 
      int high = numbers[0]; 
      int low = numbers[0]; 
      System.out.println("The highest value is: "); 
+0

Большое спасибо за помощь, которая сделала трюк. Я подумал, что это было что-то крошечное, которое нужно было отрегулировать. – Bails

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