2013-04-21 3 views
-1

Я работаю над приложением интерактивной сортировки в JavaFX:Java - летучий переменная не обновляется

  • Числа представлены в виде прямоугольников
  • Каждый раз два числа меняются местами прямоугольники местами (с помощью временной шкалы - анимация)

Это один из алгоритмов сортировки:

public class BubbleSort implements SortAlgorithm { 
private volatile Boolean swaping; 

public void sort(double[] array, CompareFunction compareFunction, Model model, Controller controller) { 
    Boolean ord; 
    int i; 
    double aux; 

    swaping = false; 

    do { 
     ord = true; 

     for (i = 0; i < array.length - 1; i++) { 
      if (compareFunction.compare(array[i], array[i + 1]) == false) { 
       while (swaping); 

       swaping = true; 

       aux = array[i]; 
       array[i] = array[i + 1]; 
       array[i + 1] = aux; 
       ord = false; 

       controller.swapRectangles(model.getRectangles().get(i), model.getRectangles().get(i + 1), this); 
      } 
     } 
    } while (ord == false); 
} 

public void setSwaping(Boolean swaping) { 
    this.swaping = swaping; 
} 

}

Это прототип метода swapRectangles:

public void swapRectangles(final Rectangle rectangle1, final Rectangle rectangle2, final BubbleSort bubbleSort) 

И когда сроки заканчивается I udpate "swaping" значение:

 timeline2.setOnFinished(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent actionEvent) { 
      setRectangleFill(rectangle2, Color.BLACK); 
      rectangle2.setX(rectangle1X); 
      bubbleSort.setSwaping(false); 
     } 
    }); 

Проблема, что "swaping" переменная никогда не обновляется (метод setSwaping никогда не вызывается).

Знаете ли вы, почему?

+0

Как вы знаете, что не обновляете? –

+0

Потому что приложение замерзает. После того, как «swaping» станет «true», он не переходит из «while (swaping)». –

ответ

2
  1. Запуск while(swaping); ставит жесткое давление на процессоре, вы принимаете все это власть и отдать его «лентяй» петля. Для того, чтобы решить, что либо добавить сон внутри: while(swaping) Thread.sleep(100); или использовать более удобный механизм синхронизации как Semaphore

  2. Кроме того, если вы запустите sort на UI потоке вы блокировать его полностью, таким образом setOnFinished никогда не получить шанс быть запущен. Вы должны запустить sort в отдельном потоке:

    new Thread() { 
        public void run() { 
         new BubbleSort().sort(array, compareFunction, model, controller); 
        } 
    }.start(); 
    

При обновлении пользовательского интерфейса из этого потока, убедитесь, что вы завернуть UI звонки в Platform.runLater.

0

Я думаю, что вы обновили swaping = true в setSwaping метод, но в порядке сортировки вы снова установили swaping= false перед тем, как цикл выполнить. Поэтому я думаю, что ваш цикл while никогда не выполняется, поскольку swaping является ложным. Поэтому вы предполагаете, что значение не обновляется.

Удалите эту строку из метода sort:

swaping = false; 


while (swaping); 

удалить ; и поместить свой код в то время как блок.

+0

Приложение замерзает после первого свопа. Когда «swaping» становится «true», при следующем «свопе» никогда не пройдет «пока (swaping)». –

+0

Я удалил эту строку, и приложение все еще зависает. –

+0

Нет, я положил туда «;» потому что продолжительность анимации равна 1 с, а «следующий своп» должен ждать окончания анимации. –

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