Buongiorno a tutti!!
avrei bisogno di un piccolo aiuto sull'interfaccia comparable.
Devo scrivere un piccolo programmino che simuli la gestione a priorità di processi in modo seguente:
1) il processo a priorità maggiore viene eseguito per 10 quanti, oppure il tempo rimanente se questo è
inferiore a 10 quanti; se vi sono più processi con la stessa priorità massima, viene privilegiato quello
con identificativo minore;
2) la priorità del processo è diminuita di una unità e il processo viene rimesso in coda.
In input il programma legge un file .txt con il seguente formato:
identificativo priorità tempo
ad esempio:
1 5 45
2 6 50
3 4 20
E in input deve stampare ad ogni passo :
identificativo priorità iniziale priorità parziale tempo residuo
Questo è quello che ho prodotto, l'idea di fondo è stata immagazzinare tutti i processi in un ArrayList, ordinarlo di volta in volta ad ogni passo sfruttando la compareTo per confrontare le priorità parziali.
Funziona tutto molto bene ma ho solo un problema, non riesco a far si che a parità di priorità parziale si debba privilegiare il processo con identificativo più basso, idee?
CLASSE PROCESSO
public class Process implements Comparable<Process>{
private int iID;
private int iPriority;
private int iTimeExe;
private int iPriorityPartial;
public Process(int id, int partPriority, int priority, int time){
this.iID = id;
this.iPriority = priority;
this.iPriorityPartial = partPriority;
this.iTimeExe = time;
}
public void toPrint(){
System.out.println(iID + " " + iPriority + " " + iPriorityPartial + " " + iTimeExe);
}
public int getID(){
return this.iID;
}
public void setTimeExe(int t){
this.iTimeExe = t;
}
public int getTimeExe(){
return this.iTimeExe;
}
public void setPriorityPartial(int p){
this.iPriorityPartial = p;
}
public int getPriorityPartial(){
return this.iPriorityPartial;
}
public void setPriority(int p){
this.iPriority = p;
}
public int getPriority(){
return this.iPriority;
}
public int compareTo(Process p){
return(p.iPriorityPartial - this.iPriorityPartial);
}
}
CLASSE SIMULATOR
import java.io.*;
import java.util.*;
public class ProcessSimulator {
ArrayList<Process> listProcess;
public ProcessSimulator(FileReader file){
Scanner scan = new Scanner(file);
int id = 0;
int prio = 0;
int time = 0;
listProcess = new ArrayList<Process>();
while(scan.hasNext()){
id = scan.nextInt();
prio = scan.nextInt();
time = scan.nextInt();
listProcess.add(new Process(id, prio, prio, time));
}
scan.close();
}
public void StartSilumation(){
Collections.sort(listProcess);
while(!listProcess.isEmpty()){
Process p = listProcess.get(0);
stepSimulation(p);
p.toPrint();
if(p.getTimeExe() == 0)
listProcess.remove(0);
Collections.sort(listProcess);
}
}
private void stepSimulation(Process p){
int iExecTime = p.getTimeExe();
int iPartPriority = p.getPriorityPartial();
if( iExecTime < 10)
p.setTimeExe(0);
else
p.setTimeExe(iExecTime - 10);
p.setPriorityPartial(iPartPriority - 1);
}
}
CLASSE MAIN PER L'ESECUZIONE DEL PROGRAMMA
import java.io.*;
public class Main {
public static void main(String[] args) {
if(args.length != 1){
System.err.println("Inserisci il numero corretto di parametri (1)");
System.exit(0);
}
assert(args.length == 1);
String sFile = args[0];
FileReader file = null;
try{
file = new FileReader(sFile);
}catch(Exception e){
System.err.println("Non riesco ad aprire il file : " + sFile);
System.exit(0);
}
ProcessSimulator simulation = new ProcessSimulator(file);
simulation.StartSilumation();
try{
file.close();
}catch(Exception e){
System.err.println("Non riesco a chiudere il file : " + sFile);
System.exit(0);
}
}
}
Un grazie in anticipo a chi mi darà qualche suggerimento