Modificarea clasei MyDispacher
ce are ca rol impartirea
task urilor catre hostii corespunzatori in functie de politica
si modificarea clasei MyHost
ce executa task urile primite.
RoundRobin
ShortestQueue
SizeIntervalTask
LeastWorkLeft
Am folosit un enhanced switch pentru a apela metoda corespunzatoare fiecarei politici in functie de algoritm
RoundRobin
se parcurge lista de hosti si se trimite fiecare task pe rand unui hostShortestQueue
se afla coada cu numarul minim de task uri si se trimite task ul catre hostul corespunzator apeland functiagetQueueSize
din clasaMyHost
SizeIntervalTask
se trimite task ul catre hostul corespunzator (folosind tot un enhanced switch) in functie de dimensiunea task uluiLeastWorkLeft
se afla coada cu cel mai putin timp de calcul ramas si se trimite task ul catre hostul corespunzator apeland functiagetWorkLeft
din clasaMyHost
PriorityQueue
- coada de task uri sortata dupa prioritate, apoi dupa timpul de sosirelock
- lock pentru a realiza sincronizareaisRunning
- flag pentru a sti daca hostul este inca in executiehaveThread
- flag pentru a sti daca hostul are threaduri in executieglobalTask
- task ul global al hostuluitimeStart si timeEnd
- timpul de inceput si de sfarsit al task ului global
run
- se ruleaza un loop infinit cat timp ruleaza hostul
- se alege primul task din coada si se executa
addTask
- se adauga task ul in coada
- se notifica thread ul din metoda
run
ca s-a adaugat un task nou in cazul in care task ul are prioritate mai mare si poate fi preemptat task ul curent care se executa
Ca si metode de sincronizare am folosit synchronized
pentru a sincroniza metoda addTask
din clasa MyDispatcher
deoarece sunt mai multi TaskGeneratori care adauga task uri apeland
dispatcher ul.
Am folosit si variabila de tip lock pentru a sincroniza metoda run si metoda addTask din clasa MyHost
deoarece sunt thread uri care ruleaza in paralel si pot aparea probleme de sincronizare.
Am folosit si o coada de task uri de tip PriorityBlockingQueue
pentru operatiile ei care sunt
thread safe.