For å slippe diverse dårlige/kreative løsninger som fort kan innebære mye knoting tilbyr Java wait() og notify() som gjør det enkelt for tråder å dele på de samme objektene.
Her er et enkelt og forståelig eksempel som tar utgangspunkt i det å være en vaskemaskin:
class Vaskemaskin { private static boolean klar = true; private static String klesvask = null; public synchronized void start(String møkketeKlesvask) throws InterruptedException { if (klesvask == null && klar) { klar = false; klesvask = møkketeKlesvask; System.out.println("Starter vasking av " + klesvask); Thread.sleep(3000); // later som 3 sekund er 3 timer klar = true; notify(); // si i fra til ventende tråd } else { wait(); // vent } } public synchronized void tøm() throws InterruptedException { if (klesvask == null || !klar) { wait(); // vent } else { if (klesvask != null) { System.out.println("Tømmer vaskemaskin for " + klesvask); klesvask = null; } notify(); // si i fra til ventende tråd } } }
Klassen Vaskemaskin tilbyr her bare to metoder – en for å starte en ny omgang og en for å tømme etterpå.
Begge er synkroniserte så programmet ville faktisk fungert uten notify() og wait(), problemet er da at tråden for å tømme vaskemaskinen stadig vil gjøre unødvendige kall på tøm().
For å teste denne klassen kan følgende benyttes:
private static Vaskemaskin vaskemaskin = new Vaskemaskin(); public static void main(String[] args) { // Sett på maskin new Thread(new Runnable() { public void run() { while (true) { try { vaskemaskin.start( klesvask() ); } catch (InterruptedException ex) {} } } }).start(); // Vent på maskin for å tømme new Thread(new Runnable() { public void run() { while (true) { try { vaskemaskin.tøm(); } catch (InterruptedException ex) {} } } }).start(); } public static String klesvask() { String[] klær = new String[] { "noen sokker", "litt håndklær", "ett dynetrekk", "noen putetrekk", "et par laken", "litt gensere", "noen bukser" }; return klær[(int) (Math.random() * klær.length)]; }
.. som så gir et eller annet som ligner dette:
Starter vasking av litt håndklær Tømmer vaskemaskin for litt håndklær Starter vasking av noen sokker Tømmer vaskemaskin for noen sokker Starter vasking av litt håndklær Tømmer vaskemaskin for litt håndklær ...