Rivedendo un po' di concetti mi sono imbattuto in un esercizio sui thread dove viene richiesto di astrarre il concetto di corsa. All'interno, oltre alla classe del main e a quella che rappresenta il thread del corridore, bisogna definire anche una classe Giudice che definisce un thread che deve partire nel momento in cui parte la corsa e rimanere in attesa fino a che il primo corridore raggiunge il traguardo, a quel punto deve stampare un messaggio esplicativo.
Ho sincronizzato quindi i metodi run del corridore e del giudice e ho utilizzato wait() e notify() ma il problema è che il giudice non viene mai "risvegliato" dal suo stato di attesa anche dopo aver chiamato notify().
Vi posto il codice incriminato:
classe Runner
codice:
package thread;
import java.util.ArrayList;
import java.util.List;
public class Runner implements Runnable {
static List<String> ordineArrivo = new ArrayList<>();
public Runner(String nome) {
Thread runner = new Thread(this, nome);
runner.setName(nome);
runner.start();
}
@Override
public synchronized void run() {
for(int i=0; i<=10; i++) {
long attesa;
try {
double numero = (Math.random()*1000)+500;
attesa = (long) numero ;
Thread.sleep(attesa);
}
catch(InterruptedException exc) {
exc.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + i*10 + "m");
}
System.out.println(Thread.currentThread().getName() + " arrivato");
ordineArrivo.add(Thread.currentThread().getName());
notify();
}
public static List<String> getLista() {
return ordineArrivo;
}
}
classe Giudice:
codice:
package thread;
public class Giudice implements Runnable {
protected static boolean primoArrivato = false;
public Giudice() {
Thread giudice = new Thread(this);
giudice.start();
}
@Override
public synchronized void run() {
System.out.println("giudice presente");
while (primoArrivato == false) {
try {
wait();
} catch (InterruptedException exc) {
exc.printStackTrace();
}
primoArrivato = true;
}
System.out.println("il primo è arrivato");
}
}
Dove sbaglio?