同步情况下的生产者/消费者关系
//
Buffer接口方法

public
interface
Buffer
...
{

public void set(int value);
public int get();
}



//
消费者

public
class
Consumer
extends
Thread
...
{

private Buffer sharedLocation;

public Consumer(Buffer shared)

...{
super("Consumer");
sharedLocation = shared;
}

public void run()

...{
int sum=0;
for(int i=1;i<=4;i++)

...{

try...{
Thread.sleep((int)(Math.random() * 3001));
sum = sum + sharedLocation.get();

}catch(InterruptedException e)...{
e.printStackTrace();
}
}

System.err.println(getName() + "done producing." + " Termination" + getName() + ".");
}

}



//
生产者

public
class
Product
extends
Thread
...
{

private Buffer sharedLocation;

public Product(Buffer shared)

...{
super("Product");
sharedLocation = shared;
}

public void run()

...{
for(int i=1;i<=4;i++)

...{

try...{
Thread.sleep((int)(Math.random() * 3001));
sharedLocation.set(i);

}catch(InterruptedException e)...{
e.printStackTrace();
}
}

System.err.println(getName() + "done producing." + " Termination" + getName() + ".");
}

}



//
实现对共享数据的同步访问方法

public
class
SynchronizedBuffer
implements
Buffer
...
{

private int buffer = -1;
private int occupiedBufferCount = 0;
public synchronized void set(int value)

...{
String name = Thread.currentThread().getName();

while(occupiedBufferCount == 1)...{

try...{
System.err.println(name + " tries to write.");
displayState( "Buffer full. " + name + "waits.");
wait();

}catch(InterruptedException e)...{
e.printStackTrace();
}
}
buffer = value;
++occupiedBufferCount;
displayState(name + "writes" + buffer);
notify();
}

public synchronized int get() ...{

String name = Thread.currentThread().getName();

while(occupiedBufferCount==0)...{

try ...{
System.err.println(name + "tries to read");
displayState("Buffer empty." + name + "waits");
wait();

} catch (InterruptedException e) ...{
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
--occupiedBufferCount;
displayState(name + "reads" + buffer);
notify();
return buffer;
}


public void displayState(String operation) ...{

StringBuffer outputLine = new StringBuffer(operation);
outputLine.setLength(40);
outputLine.append(buffer + " " + occupiedBufferCount);
System.err.println(outputLine);
System.err.println();
}


}



//
测试类

public
class
SharedBufferTest2
...
{


public static void main(String[] arg)...{
SynchronizedBuffer sharedLocation = new SynchronizedBuffer();
StringBuffer columnHeads = new StringBuffer("Operation");
columnHeads.setLength(40);
columnHeads.append("Buffer Occupied Count");
System.err.println(columnHeads);
System.err.println();
sharedLocation.displayState("Initial State");
Product product = new Product(sharedLocation);
Consumer consumer = new Consumer(sharedLocation);
product.start();
consumer.start();
}
}



















































































































































































