Hoe de finish van alle taken in een lus te controleren terwijl \ for

Ik heb een ArrayList van Routine-objecten en ik moet deze methode gebruiken om de verschillende status van de taak bij te werken

    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;
            }
        }
    }

helaas is de boolean allRoutineComplete in de my-implementatie ingesteld als true voor het einde van de routine.

Wat is er mis in mijn code?

Hoe efficiënt de afwerking van alle taken controleren?

1
nee de routine heeft geen eigen thread ... zijn object met een teller timeRun en timeTotal en zijn ingesteld op is voltooid wanneer timeRun == timeTotal
toegevoegd de auteur Asgard, de bron
Moeten uw routines in hun eigen threads worden uitgevoerd? Hoe zit het met het gebruik van iets als een CountDownLatch ?
toegevoegd de auteur Hovercraft Full Of Eels, de bron

2 antwoord

U moet de controle van alle routine-aanvullen in de eerste voor -cyclus verplaatsen, anders is de routine meer keren voltooid.

Probeer dit te gebruiken:

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();
            }
}
2
toegevoegd
werkt prima, dank je
toegevoegd de auteur Asgard, de bron

Ik vermoed dat het probleem is dat u completedRoutineNumber = 0 niet bovenaan de while-lus instelt. Omdat je de hele lijst routines itereert, als de helft van de routines voltooid is en de while-lus meer dan twee keer loopt, zal completedRoutineNumber hoger zijn dan routineLijst.grootte() de 3e keer door, ook al zijn slechts de helft van de routines voltooid.

1
toegevoegd
completedRoutineNumber is in eerste instantie ingesteld op 0 ... het probleem is een ander probleem
toegevoegd de auteur Asgard, de bron
Asgard, de looping-structuur die je hier hebt loopt meerdere keren door de while-lus zonder het completeRoutine-nummer op 0 te zetten. Je moet completeRoutineNumber naar 0 resetten binnen de while-lus, bovenaan de while-lus. Als u het net instelt voordat u de while-lus start, lost u dit probleem niet op.
toegevoegd de auteur user1023110, de bron
Dit is correct. In feite reken je routines meerdere keren af ​​die al zijn voltooid.
toegevoegd de auteur Mike, de bron