/**
*
* 共享缓冲区的接口
*
*/
public interface Buffer {
//生产者使用的
public abstract void set(int value);
//消费者使用的
public abstract 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 count = 1; count <= 4; count++) {
try {
Thread.sleep((int)(Math.random()*3001));
sum = sum + sharedLocation.get();
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(getName() + "read values totaling:" + sum +
"./nTerminating" + getName() + ".");
}
}
/**
*
* 测试入口
*
*/
public class MainTestShareBuffer {
public static void main(String[] args) {
/*创建缓冲区*/
UnsynchronizedBuffer sharedLocation = new UnsynchronizedBuffer();
/*创建生产者与消费者 出生状态*/
Producer producer = new Producer(sharedLocation);
Consumer consumer = new
Consumer(sharedLocation);
/*进入就绪状态*/
producer.start();
consumer.start();
}
}
/**
*
* 生产者
*
*/
public class Producer extends Thread {
//缓冲区
private Buffer sharedLocation;
public Producer(Buffer shared) {
super("Producer");
sharedLocation = shared;
}
public void run() {
for(int count = 1; count <= 4; count++){
try {
//如果没有调用sleep方法,并且如果生产者首先执行,则生产者极有可能在消费者
//获得执行机会之前完成它的任务。如果消费者首先执行,则该线程极有可能
在生产 者
//获得执行机机会之前完成它的任务。
Thread.sleep((int)(Math.random()*3001));
//生产
sharedLocation.set(count);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//err打印错误流
System.err.println(getName() +
"done producing." +
"/nTerminating" + getName() + "."); //Termainat终止
};
}
/**
*
* 具体的缓冲区
*
* 含生产者和消费者线程共享的整数,两线程由set和get方法访问整数
*
*/
public class UnsynchronizedBuffer
implements Buffer{
/*共享的数据*/
private int buffer = -1;
/**
* 消费者消费一个
*/
public int get() {
//
TODO Auto-generated method stub
System.err.println(Thread.currentThread().getName() + " reads
" + buffer);
return buffer;
}
/**
* 生产者生产一个
*/
public void set(int value) {
//
TODO Auto-generated method stub
buffer = value;
System.err.println(Thread.currentThread().getName() + " writes
" + value);
}
}
转载于:https://blog.51cto.com/baiyan425/1120452