La traccia dell'esercizio è la seguente:
Realizzare la classe PeriodicExecutor, che consente di eseguire una serie di task periodicamente, con un limite al numero di task che possono essere eseguiti contemporaneamente. Il costruttore accetta questo limite. Il metodo addTask accetta un Runnable e un long x, e fa in modo che il Runnable venga eseguito ripetutamente, con un ritardo di x millisecondi tra la fine di un’esecuzione e l’inizio della successiva. Se però (ri)avviare un Runnable porta a superare il limite, l’avvio viene rimandato finché ci sarà lapossibilità di eseguirlo senza violare il limite.Il limite si riferisce al numero di task che stanno eseguendo il loro Runnable, non al periodo durante il quale stanno aspettando il ritardox.L’implementazione deve rispettare il seguente esempio d’uso:
PeriodicExecutor exec= new PeriodicExecutor(2);
Runnable r1=...
Runnable r2=...
Runnable r3=...
exec.addTask(r1,1000);
exec.addTask(r2,500);
exec.addTask(r3,700);
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class PeriodicExecutor {
BlockingQueue<Runnable> bq;
public PeriodicExecutor(int n){
bq=new ArrayBlockingQueue<>(n);
}
public void addTask(Runnable r,long x){
try {
bq.put(r);
new Thread(r).start();
bq.remove(r);
Thread.sleep(x);
} catch (InterruptedException e) {
return;
}
}
public static void main(String[] args){
PeriodicExecutor exec= new PeriodicExecutor(2);
Runnable r1=()->{
System.out.println("R1");
};
Runnable r2=()->{
System.out.println("R2");
};
Runnable r3=()->{
System.out.println("R3");
};
exec.addTask(r1,1000);
exec.addTask(r2,500);
exec.addTask(r3,700);
}
}
sono fermo sulla ripetizione del Task, se aggiungessi while(true) ripeterei solo R1 e gli altri addTask non li andrei mai a riprendere perchè non c'è un rilascio del lock. sleep() non lo rilascia.