2012-06-24 39 views
1

我有例行對象的ArrayList,我必須使用此方法來更新任務如何檢查所有任務的完成一個循環,而對於

while(!allRoutineComplete){ 
     for (Routine routine : routineList) { 
      if(!(routine.isBlocked()) && !(routine.isFinished())) { 
       routine.run(); 
       } 
     } 
     for (Routine routine : routineList) { 
      routine.updateStatus(); 
      if(routine.isFinished()){ 
       completedRoutineNumber++; 
      } 
      if(completedRoutineNumber==routineList.size()){ 
       allRoutineComplete=true; 
      } 
     } 
    } 

遺憾的是在布爾allRoutineComplete的各種狀態我的實現在所有例程完成之前設置爲true。

我的代碼有什麼問題?

如何高效地檢查所有任務的完成?

+1

如果你的程序在自己的線程中運行?怎麼樣使用[CountDownLatch](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)? –

+0

沒有例程沒有自己的線程...有計數器'timeRun'和'timeTotal'的對象,當'timeRun == timeTotal'時被設置爲'isFinished' – Asgard

回答

2

您必須在第一個for循環中移動全部例程完成檢查,否則該例程將循環完成多次。

嘗試使用此:

while(!allRoutineComplete){ 
      for (Routine routine : routineList) { 
       if(!(routine.isBlocked()) && !(routine.isFinished())) { 
        routine.run(); 
        if(routine.isFinished()){ 
         completedRoutineNumber++; 
        } 
        if(completedRoutineNumber==routineList.size()){ 
        allRoutineComplete=true; 
        } 
       } 
      } 
      for (Routine routine : routineList) { 
       routine.updateStatus(); 
      } 
} 
+0

工作正常,謝謝 – Asgard

1

我懷疑問題是你沒有在while循環的頂部設置completedRoutineNumber = 0。由於您重複了整個例程列表,如果一半的例程完成且while循環運行了兩次以上,即使只有一半例程完成,completedRoutineNumber也將第三次超過 routineList.size()。

+0

這是正確的,基本上你正在計數例程多個已經完成的時間。 – Mike

+0

completedRoutineNumber在開始時設置爲0 ...問題是另一個 – Asgard

+0

Asgard,您在這裏得到的循環結構會在while循環中運行多次,而不會將completeRoutineNumber重置爲0.您需要將completeRoutineNumber重置爲0 while循環,在while循環的頂部。如果您在啓動while循環之前將其設置好,則不會解決此問題。 – user1023110

相關問題