Ho un dubbio su un esercizio sulle espressioni lambda.
L'esercizio in questione riprende un precedente esercizio sui thread che permetteva di astrarre il concetto di osservatorio astronomico, in particolare venivano creati 10 thread (rappresentavano 10 persone) e ogni thread passava dallo stato "IN_ATTESA" a quello "OSSERVAZIONE" (che durava 3 secondi) fino a quello "FINITO".
L'esercizio sulle espressioni lambda per prima cosa chiede se è possibile fare, tramite espressioni lambda, l'override del metodo run() in modo però da modificarlo solo per un thread specifico.
Io ho pensato che si potesse fare, anche perchè parliamo di fare l'override del metodo run() che è il metodo di Runnable e cioè di una interfaccia funzionale e così ho modificato il seguente codice:
codice:
for(int i=0; i<50; i++) {
int numeroCasuale = (int)(Math.random()*10);
if (persone[numeroCasuale] != null) {
try {
Telescopio oggetto = new Telescopio(persone[numeroCasuale].getName());
oggetto.run();
}
catch (Exception exc) {
exc.printStackTrace();
}
persone[numeroCasuale] = null;
}
}
in questo modo:
codice:
for(int i=0; i<50; i++) {
int numeroCasuale = (int)(Math.random()*10);
if (persone[numeroCasuale] != null) {
try {
Telescopio oggetto = new Telescopio(persone[numeroCasuale].getName());
if(numeroCasuale == 2) {
Runnable r = () -> {
try {
System.out.println(oggetto.getNome() + Stati.OSSERVAZIONE.getStato());
Thread.sleep(10000);
System.out.println(oggetto.getNome() + Stati.FINITO.getStato());
Thread.sleep(1000);
}
catch (InterruptedException exc) {
exc.printStackTrace();
}
};
}
else {
oggetto.run();
}
catch (Exception exc) {
exc.printStackTrace();
}
persone[numeroCasuale] = null;
}
}
Errori in compilazione non ne ho (tranne un warning che avvisa che r non è utilizzato) però in realtà non funziona come vorrei perchè arrivato al thread con indice 2 in automatico è come se lo saltasse e quindi quel thred non viene proprio preso in considerazione.
Ho dato un'occhiata alla soluzione e dice che innanzitutto, con mio grande stupore, non è possibile effettuare un override del metodo run tramite un'espressione lambda ma al massimo lo si può fare tramite una classe anonima.
Ho provato a questo punto a utilizzare la classe anonima, sempre nel main, durante la creazione dell'array di thread modificando il seguente codice:
codice:
Thread[] persone;
persone = new Thread[10];
persone[0] = new Thread("Carlo ");
persone[1] = new Thread("Michele ");
persone[2] = new Thread("Aldo ")
persone[3] = new Thread("Gianni ");
persone[4] = new Thread("Federico ");
persone[5] = new Thread("Alberto ");
persone[6] = new Thread("Roberto ");
persone[7] = new Thread("Vittorio ");
persone[8] = new Thread("Antonio ");
persone[9] = new Thread("Paolo ");
in questo modo:
codice:
Thread[] persone;
persone = new Thread[10];
persone[0] = new Thread("Carlo ");
persone[1] = new Thread("Michele ");
persone[2] = new Thread("Aldo ") {
Telescopio oggetto = new Telescopio("Aldo ");
@Override
public synchronized void run() {
try {
System.out.println(oggetto.getNome() + Stati.OSSERVAZIONE.getStato());
Thread.sleep(10000);
System.out.println(oggetto.getNome() + Stati.FINITO.getStato());
Thread.sleep(1000);
}
catch (InterruptedException exc) {
exc.printStackTrace();
}
}
};
persone[3] = new Thread("Gianni ");
persone[4] = new Thread("Federico ");
persone[5] = new Thread("Alberto ");
persone[6] = new Thread("Roberto ");
persone[7] = new Thread("Vittorio ");
persone[8] = new Thread("Antonio ");
persone[9] = new Thread("Paolo ");
Anche in questo caso non ho errori di sintassi ma non funziona come vorrei infatti il thread che subisce l'override del metodo run va subito nello stato "FINITO" senza passare da "OSSERVAZIONE".
Quindi quello che vorrei cercare di capire è innanzitutto perchè non potrei fare un override di run tramite espressione lambda e poi come far funzionare correttamente il programma modificato tramite classe anonima.
Potete darmi qualche dritta?