JAVA线程通信之生产者与消费者

Posted 思余生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA线程通信之生产者与消费者相关的知识,希望对你有一定的参考价值。

package cn.test.hf.test3;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class FactoryUtils {

private Resource resource;
private int producerId = 1;

// 可重入锁
ReentrantLock lock = new ReentrantLock();
Condition ProducersCondition = lock.newCondition();

Condition customerLockCondition = lock.newCondition();

FactoryUtils() {

resource = new Resource();

resource.setId(0);
resource.setFlag(true);
}

/**
* 生产
*/
public void ProducerResource() {

lock.lock();
// 使用锁机制
try {

while (true) {

while (!resource.isFlag()) {

// 还未消费,将线程等待
System.out.println("生产者等待");
// 使用condition通知同组的等待
ProducersCondition.await();
}

// 生产
resource.setId(producerId++);
resource.setFlag(false);
System.out.println("生产者线程" + Thread.currentThread().getName() + "生产了ID为" + resource.getId() + "的产品");
// 延时一秒好看结果
Thread.sleep(1000);
// 生产完后通知消费者线程
System.out.println("通知消费者");
customerLockCondition.signalAll();
}
} catch (Exception e) {

e.printStackTrace();
} finally {

// 释放锁
lock.unlock();
}
}

/**
* 生产
*/
public synchronized void customer() {

lock.lock();
try {
while (true) {

// 消费者等待
while (resource.isFlag()) {

customerLockCondition.await();
}

// 设置为已消费
resource.setFlag(true);
System.out.println("消费者线程" + Thread.currentThread().getName() + "消费了ID为" + resource.getId() + "的产品");
// 延时一秒好看结果
Thread.sleep(1000);
// 消费完后通知生产者线程生产
System.out.println("通知生产者");
ProducersCondition.signalAll();
}
} catch (Exception e) {

e.printStackTrace();
} finally {
lock.unlock();
}
}
}






























































































以上是关于JAVA线程通信之生产者与消费者的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程的生产者与消费者模型,线程间的通信

java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

《多线程》第6节:线程通信

Java线程间通信之wait/notify

并行模式之生产者-消费者模式

Java并发程序设计设计模式与并发之生产者-消费者模式