// pipes

import java.io.*;
class Sender extends Thread {
	PipedWriter pw;
	Sender (PipedWriter w) { pw = w; }
	public void run () {

			for (int i=0; i<10; i++)  {
				try {pw.write(i);} catch (Exception e)
					{System.out.println("write exception");}
			}
	}
}


class Receiver extends Thread {
	PipedReader pr;
	Receiver (PipedReader r) { pr = r; }
	public void run () {

			int ch=10;
			for (int i=0; i<10; i++)  {
		
				try {sleep(4);ch= pr.read();} 
				catch (Exception e)
					{System.out.println("read exception");}
				System.out.println (ch);
			}
	}
}

class PipeDemo {


	public static void main (String args[]) {

		PipedReader prs; 
		PipedWriter pws; 

		try {

			prs = new PipedReader ();
			pws = new PipedWriter (prs); // connected with prs
			// or:	pws.connect(prs);

			Sender s = new Sender (pws);
			Receiver r = new Receiver (prs);
			r.start();
			Thread.sleep (100);
			s.start();

			s.join();
			r.join(); // try removing these joins

			prs.close();
			pws.close();

		} catch (Exception e) 
			{System.out.println("An exception");}
		System.out.println ("main thread ends");
	}
}


