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?

Rispondi quotando