/**
*
*
共享缓冲区的接口
*
*/
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