/*
 * scambio messaggi su variabile statica
 * con blocco e sblocco su stringa letterale
 */

class Aspetta implements Runnable {
	@Override
	public void run() {
		synchronized("abcd") {
			try {
				// blocco
				"abcd".wait();
				// lettura e cancellazione messaggio
				System.out.print("ricevuto: \"" + Messaggio.messaggio + "\"");
			}
			catch (InterruptedException e) {
			}
		}
	}
}

class Invia implements Runnable {
	@Override
	public void run() {
		synchronized("abcd") {
			try {
				Thread.sleep(2000);
			}
			catch (InterruptedException e) {
			}
			Messaggio.messaggio = "ciao";
			"abcd".notify();
		}
	}
}

public class Messaggio {
	static String messaggio;

	public static void main(String[] args) throws InterruptedException {
		Aspetta a = new Aspetta();
		Invia i = new Invia();

		Messaggio.messaggio = null;

		Thread ta = new Thread(a);
		Thread ti = new Thread(i);

		ta.start();
		ti.start();

		ta.join();
		ti.join();
	}
}
