public class HoldIntegerSynchronized
{
private int sharedInt=-1;
private boolean writeable=true;
public synchronized void setSharedInt(int val)
{
while(!writeable)
{
try
{
wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
System.err.println(Thread.currentThread().getName()+
"setting sharedInt to"+val);
sharedInt=val;
writeable=false;
notify();
}
public synchronized int getSharedInt()
{
while(writeable)
{
try
{
wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
writeable=true;
notify();
System.err.println(Thread.currentThread().getName()+
"retrieving sharedInt value"+sharedInt);
return sharedInt;
}
}
public class ConsumeInteger extends Thread { private HoldIntegerSynchronized cHold; public ConsumeInteger(HoldIntegerSynchronized h) { super("ConsumeInteger"); cHold=h; } public void run() { int val,sum=0; do { try { Thread.sleep((int)(Math.random()*10000)); } catch(InterruptedException e) { System.err.println(e.toString()); } val=cHold.getSharedInt(); sum+=val; }while(val!=10); System.err.println(getName()+"retrieved values totaling:"+ sum+"\nTerminating "+getName()); } }
public class ProduceInteger extends Thread
{
private HoldIntegerSynchronized pHold;
public ProduceInteger(HoldIntegerSynchronized h)
{
super("ProduceInteger");
pHold=h;
}
public void run()
{
for(int count=1;count<=10;count++)
{
try
{
Thread.sleep((int)(Math.random()*10000));
}
catch(InterruptedException e)
{
System.err.println(e.toString());
}
pHold.setSharedInt(count);
}
System.err.println(getName()+"finished producing values"+
"\nTermininating "+getName());
}
}
public class SharedCell
{
public static void main(String[] args)
{
HoldIntegerSynchronized h=new HoldIntegerSynchronized();
ProduceInteger p=new ProduceInteger(h);
ConsumeInteger c=new ConsumeInteger(h);
p.start();
c.start();
}
}