/*
 * messaggi scritti e letti in una lista
 */

import java.util.LinkedList;

class Riceve implements Runnable {
	LinkedList<String> messaggi;

	public Riceve(LinkedList<String> messaggi) {
		this.messaggi = messaggi;
	}

	@Override
	public void run() {
		synchronized(this.messaggi) {
			try {
				this.messaggi.wait();
				System.out.print("        ricevuto: \"");
				System.out.print(messaggi.get(0));
				System.out.print("\"");
				messaggi.remove(0);
			}
			catch (InterruptedException e) {
			}
		}
	}
}

class Manda implements Runnable {
	LinkedList<String> messaggi;

	public Manda(LinkedList<String> messaggi) {
		this.messaggi = messaggi;
	}

	@Override
	public void run() {
		synchronized(this.messaggi) {
			try {
				Thread.sleep(2000 + (long) (2000 * Math.random()));
				this.messaggi.add("un messaggio");
				this.messaggi.notify();
			}
			catch (InterruptedException e) {
			}
		}
	}
}

public class Coda {
	public static void main(String[] args) throws InterruptedException {
		Riceve riceve;
		Manda manda;
		LinkedList<String> messaggi;

		messaggi = new LinkedList<String>();
		riceve = new Riceve(messaggi);
		manda = new Manda(messaggi);

		Thread tm = new Thread(manda);
		Thread tr = new Thread(riceve);

		tr.start();
		tm.start();

		// tm.join();
		// tr.join();
	}
}
