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?