// Program to use wait( ) and notify( ) and implementing
// from Runnable interface.class Resource
{
int n = -1;
boolean flag = true;synchronized void produce( int a )
{
while( !flag )
{
try
{
wait();
}
catch( InterruptedException e ) { }
}
n = a;
System.out.println( " Producer ::: " + n );
flag = false;
notify();
}synchronized int consume()
{
while( flag )
{
try
{
wait();
}
catch( InterruptedException e ) { }
}
flag = true;
notify();
System.out.println( " Consumer ::: " + n );
return n;
}
}class Producer implements Runnable
{
Resource s;
Thread t;
Producer( Resource r )
{
s = r;
t = new Thread( this, "Producer");
t.start();
}public void run()
{
for( int i=1 ; i<=10 ; i++ )
{
try
{
Thread.sleep( 300 );
}
catch( InterruptedException e ) { }
s.produce( i );
}
System.out.println( " Producer Terminating. " );
}
}class Consumer implements Runnable
{
Resource s;
Thread t;
Consumer( Resource r )
{
s = r;
t = new Thread( this, "Consumer");
t.start();
}public void run()
{
int i;
do
{
try
{
Thread.sleep( 300 );
}
catch( InterruptedException e ) { }
i = s.consume();
}while( i != 10 );
System.out.println("Consumer Terminating. " );
}
}class WaitNotifyDemo
{
public static void main(String args[ ])
{
Resource r = new Resource();
new Producer( r );
new Consumer( r );
}
}
Output:
Producer ::: 1
Consumer ::: 1
Producer ::: 2
Consumer ::: 2
Producer ::: 3
Consumer ::: 3
Producer ::: 4
Consumer ::: 4
Producer ::: 5
Consumer ::: 5
Producer ::: 6
Consumer ::: 6
Producer ::: 7
Consumer ::: 7
Producer ::: 8
Consumer ::: 8
Producer ::: 9
Consumer ::: 9
Producer ::: 10
Consumer ::: 10
Consumer Terminating.
Producer Terminating.