Java生产者消费者
一、单生产者单消费者
/**
* <p>Title: ProducerConsumerDemo</p>
* <p>Description: ProducerConsumerDemo</p>
*/
public class ProducerConsumerDemo {
/**
* 主函数
* <p>Title: main</p>
* <p>Description: 主函数</p>
* @param args
*/
public static void main(String[] args) {
Resource resource = new Resource();
Producer producer = new Producer(resource);
Consumer consumer = new Consumer(resource);
Thread producerThread = new Thread(producer);
Thread consumerThread = new Thread(consumer);
producerThread.start();
consumerThread.start();
}
}
/**
* 生产者
* <p>Title: Producer</p>
* <p>Description: 生产者</p>
*/
class Producer implements Runnable {
Resource resource;
/**
* <p>Title: 构造器</p>
* <p>Description: 构造器</p>
*/
public Producer(Resource resource) {
this.resource = resource;
}
/* (non-Javadoc)
* <p>Title: run</p>
* <p>Description: </p>
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
while(true) {
resource.produce("面包");
}
}
}
/**
* 消费者
* <p>Title: Consumer</p>
* <p>Description: 消费者</p>
*/
class Consumer implements Runnable {
Resource resource;
/**
* <p>Title: 构造器</p>
* <p>Description: 构造器</p>
*/
public Consumer(Resource resource) {
this.resource = resource;
}
/* (non-Javadoc)
* <p>Title: run</p>
* <p>Description: </p>
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
while(true) {
resource.consume();
}
}
}
/**
* 资源
* <p>Title: Resource</p>
* <p>Description: 资源</p>
*/
class Resource {
private String name;
private int count = 1;
private boolean flag = false;
/**
* 生产资源
* <p>Title: produce</p>
* <p>Description: 生产资源</p>
* @param name
*/
public synchronized void produce(String name) {
if (flag) {
try {this.wait();} catch (InterruptedException e) {e.getMessage();}
}
this.name = name + count;
count++;
System.out.println(Thread.currentThread().getName() + "......生产。。。。。。" + this.name);
flag = true;
this.notify();
}
/**
* 消费资源
* <p>Title: consume</p>
* <p>Description: 消费资源</p>
*/
public synchronized void consume() {
if (!flag) {
try {this.wait();} catch (InterruptedException e) {e.getMessage();}
}
System.out.println(Thread.currentThread().getName() + "............消费......。。。。。。" + this.name);
flag = false;
this.notify();
}
}
二、多生产者多消费者
/**
* <p>Title: MultiProducerConsumerDemo</p>
* <p>Description: MultiProducerConsumerDemo</p>
*/
public class MultiProducerConsumerDemo {
/**
* 主函数
* <p>Title: main</p>
* <p>Description: 主函数</p>
* @param args
*/
public static void main(String[] args) {
Resources resource = new Resources();
MultiProducer producer = new MultiProducer(resource);
MultiConsumer consumer = new MultiConsumer(resource);
Thread t0 = new Thread(producer);
Thread t1 = new Thread(producer);
Thread t2 = new Thread(consumer);
Thread t3 = new Thread(consumer);
t0.start();
t1.start();
t2.start();
t3.start();
}
}
/**
* 多生产者
* <p>Title: Producer</p>
* <p>Description: 多生产者</p>
*/
class MultiProducer implements Runnable {
Resources resource;
/**
* <p>Title: 构造器</p>
* <p>Description: 构造器</p>
*/
public MultiProducer(Resources resource) {
this.resource = resource;
}
/* (non-Javadoc)
* <p>Title: run</p>
* <p>Description: </p>
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
while(true) {
resource.produce("面包");
}
}
}
/**
* 多消费者
* <p>Title: Consumer</p>
* <p>Description: 多消费者</p>
*/
class MultiConsumer implements Runnable {
Resources resource;
/**
* <p>Title: 构造器</p>
* <p>Description: 构造器</p>
*/
public MultiConsumer(Resources resource) {
this.resource = resource;
}
/* (non-Javadoc)
* <p>Title: run</p>
* <p>Description: </p>
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
while(true) {
resource.consume();
}
}
}
/**
* 资源
* <p>Title: Resource</p>
* <p>Description: 资源</p>
*/
class Resources {
private String name;
private int count = 1;
private boolean flag = false;
/**
* 生产资源
* <p>Title: produce</p>
* <p>Description: 生产资源</p>
* @param name
*/
public synchronized void produce(String name) {
while (flag) {
try {this.wait();} catch (InterruptedException e) {e.getMessage();}
}
this.name = name + count;
count++;
System.out.println(Thread.currentThread().getName() + "......生产。。。。。。" + this.name);
flag = true;
this.notifyAll();
}
/**
* 消费资源
* <p>Title: consume</p>
* <p>Description: 消费资源</p>
*/
public synchronized void consume() {
while (!flag) {
try {this.wait();} catch (InterruptedException e) {e.getMessage();}
}
System.out.println(Thread.currentThread().getName() + "............消费......。。。。。。" + this.name);
flag = false;
this.notifyAll();
}
}