同步情况下的生产者/消费者关系
//
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();
}
}
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();
}
}