1.JAVA多线程(九)Java多线程之生产者与消费者
- 需求如下:自定义多线程生产者与消费者
- 1.如果生产者没有生产消息,就需要去生产消息,消费者就需要等待消费者生产完以后再去消费。
- 2.如果消费者没有消费消息,那么生产者就需要等待,消费都消费完成后,再去生产消息。
1.1 生产者与消费者【一个生产线程和一个消费者线程】
package com.yuanxw.chapter9;
/**
* 自定义多线程生产者与消费者
* 1.如果生产者没有生产消息,就需要去生产消息,消费者就需要等待消费者生产完以后再去消费。
* 2.如果消费者没有消费消息,那么生产者就需要等待,消费都消费完成后,再去生产消息。
*/
public class ProduceConsumer {
/** 生产数量 **/
private int num = 0;
/** 锁 **/
protected final Object LOCK = new Object();
/** volatile:内存可见性关键字,默认为没有生产,可以进行生产 **/
private volatile boolean isProducted = false;
/**
* 生产方法
* @return
*/
public void produce() throws InterruptedException {
// 同步生产
synchronized (LOCK){
// 如果消息已经生产,需要等待消费者消费后再去生产
if(isProducted){
/**
* 调用 wait() 使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程的运行使得这个条件满足时,其它线程会调用 notify() 或者 notifyAll() 来唤醒挂起的线程。
* 它们都属于 Object 的一部分,而不属于 Thread。
*/
LOCK.wait();
}else {
// 如果已经消费,那么就需要进行生产
num++;
System.out.println(String.format("生产消息>>【%s】", num));
/**
* 调用 wait() 使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程的运行使得这个条件满足时,其它线程会调用 notify() 或者 notifyAll() 来唤醒挂起的线程。
* 它们都属于 Object 的一部分,而不属于 Thread。
*/
// 通知消费者,可以进行消费
LOCK.notify();
// 设置标记:已经生产
isProducted = true;
}
}
}
/**
* 消费方法
*/
public void consumer() throws InterruptedException {
// 同步消费
synchronized (LOCK){
/