/*
 * versione che manda/riceve piu' messaggi
 */

import java.util.LinkedList;

class Ricevitore implements Runnable {
	LinkedList<String> messaggi;

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

	@Override
	public void run() {
		String s;
		synchronized(this.messaggi) {
			try {
				out: while (true) {
					while (messaggi.size() > 0) {
						s = messaggi.get(0);
						messaggi.remove(0);
						if (s == null)
							break out;
						System.out.print("        ricevuto: \"");
						System.out.print(s);
						System.out.println("\"");
					}
					this.messaggi.wait();
				}
			}
			catch (InterruptedException e) {
			}
		}
	}
}

class Generatore implements Runnable {
	LinkedList<String> messaggi;

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

	@Override
	public void run() {
		try {
			for (int i = 0; i < 3; i++) {
				Thread.sleep(2000 + (long) (2000 * Math.random()));
				synchronized(this.messaggi) {
					this.messaggi.add("messaggio" + i);
					this.messaggi.notify();
				}
			}
			synchronized(this.messaggi) {
				this.messaggi.add(null);
				this.messaggi.notify();
			}
		}
		catch (InterruptedException e) {
		}
	}
}

public class Iterato {
	public static void main(String[] args) throws InterruptedException {
		Ricevitore riceve;
		Generatore manda;
		LinkedList<String> messaggi;

		messaggi = new LinkedList<String>();
		riceve = new Ricevitore(messaggi);
		manda = new Generatore(messaggi);

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

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

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