您的位置:首页 > 其它

生产者消费者模型(单个生产者和单个消费者)

2016-04-07 14:16 471 查看

生产者消费者模型(单个生产者和单个消费者)

场景描述

多线程开发中很经典的一个案例就是生产者消费者模型,它们共享资源,但是对资源的操作方式并不同。因此它们需要协调资源,否则就会出现线程安全问题。

代码展示

Resource Code

/**
* 生产者和消费者共享的资源Resource对象
* @author xuyi3
* @2016年4月7日 @下午2:01:21
* @Resource
* @功能说明:<br>
* @春风十里不如你
* @备注
*/
public class Resource {
/** 资源名称 */
private String name;
/** 资源标识符 */
private boolean flag = false;
//省略setter 和 getter 方法
}


ProductThread Code

/**
* 生产者线程
* @author xuyi3
* @2016年4月7日 @下午1:38:16
* @ProductThread
* @功能说明:生产产品<br>
* @春风十里不如你
* @备注
*/
public class ProductThread implements Runnable {
//共享资源Resource对象
private Resource resource;
public ProductThread(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
int count = 1;
// 生产产品
while (true) {

synchronized (resource) {//共享资源对象(同步的锁要相同否则就错误)
if (resource.isFlag()) {// 标识已经有资源
// wait();
try {
resource.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
// 生产资源
resource.setName("产品" + count);
System.out.println("生产者生产--->" + resource.getName());
count++;
resource.setFlag(true);
// notify();
resource.notify();
}
}
}
}
}


ConsumerThread Code

/**
* 消费者对象
* @author xuyi3
* @2016年4月7日 @下午2:07:22
* @ConsumerThread
* @功能说明:<br>
* @春风十里不如你
* @备注
*/
public class ConsumerThread implements Runnable {

// 共享资源Resource对象
private Resource resource;
public ConsumerThread(Resource resource) {
this.resource = resource;
}
@Override
public void run() {

while (true) {
synchronized (resource) {//共享资源对象(同步的锁要相同否则就错误)
if (!resource.isFlag()) {// 标识没有数据
// wait()
try {
resource.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("消费者消费===》" + resource.getName());
resource.setFlag(false);// 标识已经消费了
// notify()
resource.notify();
}
}
}
}
}


AppMain Code

public class AppMain {

public static void main(String[] args) {
// 共享资源对象
Resource resource = new Resource();
// 创建生产者对象
ProductThread productThread = new ProductThread(resource);
// 创建消费者对象
ConsumerThread consumerThread = new ConsumerThread(resource);

// 启动两个线程
new Thread(productThread).start();
new Thread(consumerThread).start();
}
}


总结说明

单个生产者和单个消费者模型实现的关键在于,资源共享(同步同个对象锁)和资源的标识以及等待唤醒机制wait()和notify()方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程安全 多线程