2013-04-21 69 views
-1

我工作在JavaFX的交互式排序應用:爪哇 - volatile變量沒有更新

  • 這些號碼由矩形
  • 每次兩個號碼都換了矩形代表交換(使用時間表 - 動畫)

這是排序算法之一:

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) 

當時間軸結束我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

你怎麼知道它沒有更新? – 2013-04-21 13:52:11

+0

因爲應用程序凍結。 「交換」變爲「真」後,它不會從「while(swaping);」傳遞。 – 2013-04-21 13:54:06

回答

2
  1. 運行while(swaping);穿上處理器硬壓力,你正在服用的所有它的力量,並給它「什麼也不做」循環。爲了解決這個無論是補充睡眠中:while(swaping) Thread.sleep(100);或者,如果你在你阻止它完全,從而setOnFinished永遠不會要運行的機會UI線程上運行sort使用更方便的同步機制一樣Semaphore

  2. 也。你應該在一個單獨的線程上運行sort

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

如果更新此主題的UI,請確保你包UI調用到Platform.runLater

0

我認爲你在setSwaping方法中更新了swaping = true方法,但在排序方法中,while循環執行前再次設置了swaping= false。所以我認爲你的while循環從不執行,因爲交換是錯誤的。所以你假設價值沒有被更新。

sort方法刪除此行:

swaping = false; 


while (swaping); 

刪除;,把你的代碼中,而塊。

+0

首次交換後,應用程序會凍結。當「交換」變爲「真」時,在下一個「交換」將永遠不會通過「while(swaping);」。 – 2013-04-21 13:55:44

+0

我刪除了該行,應用程序仍然凍結。 – 2013-04-21 13:57:07

+0

不,我放在那裏「;」因爲動畫的持續時間是1秒,「下一個交換」必須等待動畫結束。 – 2013-04-21 14:01:09