Ein Taskrunner in Java: Priorität beachten

in deutsch •  4 months ago 

Mit der Klasse Tasklist werden alle zuvor erstellten Tasks in einer Liste verwaltet, die dann abgearbeitet werden können.
Das Herzstück ist die addTask-Funktion. Dabei wird zunächst überprüft ob die Task die höchste Priorität HIGH hat. Ist dies der Fall so wird diese Task immer am Anfang der Liste eingefügt.
Im Falle der niedrigsten Priorität LOW wird die Task am Ende der Liste eingefügt.

Nun stellt sich die Frage, wo genau soll denn eine Task eingefügt werden die eine mittlere Priorität NORMAL hat?
Eine einfache Überlegung wäre eine Task einfach in der Mitte der Liste einzufügen. Doch Vorsicht. Hat die Liste zum Beispiel 10 Tasks und die ersten 7 Tasks haben die Priorität HIGH und die letzten 3 LOW, dann würde eine Task mit mittlere Priorität zwischen zwei Task platziert die eine hohe Priorität haben.
Also HIGH, HIGH, HIGH, HIGH, HIGH, NORMAL, HIGH, HIGH, LOW, LOW, LOW.
NORMAL muss aber immer nach HIGH und vor LOW kommen.

Ein Lösungsvorschlag wäre, wie in der Funktion getBoundary gezeigt, die Liste aller Tasks zunächst zu durchlaufen. Sobald der erste Task in der Liste gefunden wird der nicht die Priorität HIGH hat, so wird dieser Index der Liste zurückgegeben. Dann wird die Task mit mittlere Priorität an diesem Index eingefügt. So wird sichergestellt, dass Tasks mit der Priorität NORMAL immer nach HIGH und vor LOW eingefügt werden.

Die App-Klasse zeigt ein Demonstrationsbeispiel. Es kann sein dass man für jede Klasse eine separate Java-Datei anlegen muss.

package taskrunner;

import java.util.logging.Logger;
import java.util.ArrayList;
import java.util.List;

public enum Priority {
    LOW, NORMAL, HIGH
}

public class Task {

    private static final Logger logger = Logger.getLogger(Task.class.getName());
    private String id;
    private Priority priority;
    private int duration;

    public Task(String id, Priority priority, int duration){
        this.id = id;
        this.priority = priority;
        this.duration = duration;
    }

    public void process(){
        while(duration > 0) {
            try {
                Thread.sleep(duration * 1000L);
                duration--;
                System.out.println(this);
            } catch (InterruptedException e) {
                logger.severe(e.toString());
            }
        }
    }

    public Priority getPriority(){
        return priority;
    }

    @Override
    public String toString(){
        return "("+this.id+" - "+this.priority+" - "+this.duration+")";
    }
}

public class Tasklist {

    private List<Task> tasklist;

    public Tasklist(){
        tasklist = new ArrayList<Task>();
    }

    public void addTask(Task task){
        if(task.getPriority() == Priority.HIGH){
            tasklist.addFirst(task);
        } else if(task.getPriority() == Priority.LOW){
            tasklist.addLast(task);
        } else {
            int maxhigh = getBoundary();
            tasklist.add(maxhigh, task);
        }
    }

    private int getBoundary(){
        for(var n = 0; n < tasklist.size(); n++){
            if(tasklist.get(n).getPriority() != Priority.HIGH){
                return n;
            }
        }
        return 0;
    }

    public void runTasks(){
        tasklist.forEach(Task::process);
    }
}

public class App {

    public App(){
        Tasklist t = new Tasklist();
        t.addTask(new Task("a", Priority.NORMAL, 2));
        t.addTask(new Task("b", Priority.NORMAL, 3));
        t.addTask(new Task("c", Priority.LOW, 3));
        t.addTask(new Task("d", Priority.HIGH, 2));
        t.addTask(new Task("d", Priority.HIGH, 2));
        t.addTask(new Task("e", Priority.HIGH, 3));
        t.addTask(new Task("f", Priority.LOW, 4));
        t.addTask(new Task("h", Priority.HIGH, 7));
        t.addTask(new Task("i", Priority.HIGH, 2));
        t.addTask(new Task("j", Priority.LOW, 4));
        t.addTask(new Task("k", Priority.HIGH, 3));
        t.addTask(new Task("l", Priority.NORMAL, 3));
        t.runTasks();
    }

    public static void main(String[] args){
        new App();
    }
}

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!