Java多线程技术~生产者和消费者问题
本文是上一篇文章的后续,详情点击该连接
线程通信
应用场景:生产者和消费者问题
假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费
如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止
如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止
分析
这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件
对于生产者,没有生产产品之前,要通知消费者等待。而生产了产品之后,又需要马上通知消费者消费
对于消费者,在消费之后,要通知生产者已经消费结束,需要继续生产新产品以供消费
在生产者消费者问题中,仅有synchronized是不够的
synchronized可阻止并发更新同一个共享资源,实现了同步
synchronized不能用来实现不同线程之间的消息传递(通信)
方法名 | 作用 |
final void wait() | 表示线程一直等待,直到其它线程通知 |
void wait(long timeout) | 线程等待指定毫秒参数的时间 |
final void wait(long timeout,int nanos) | 线程等待指定毫秒、微妙的时间 |
final void notify() | 唤醒一个处于等待状态的线程 |
final void notifyAll() | 唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先运行 |
消费者,生产者线程代码实现
package com.alvin.test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
public static void main(String[] args){
//创建共享资源对象
Shop shop = new Shop();
//创建生产者
Boss boss = new Boss(shop);
//创建消费者
Customer customer = new Customer(shop);
//启动线程
new Thread(boss).start();
new Thread(customer).start();
}
}
//生产者类
class Boss implements Runnable{
private Shop shop;
public Boss(Shop shop){
this.shop = shop;
}
@Override
public void run() {
for(int i = 1; i < 100; i++){
if(i % 2 == 0){
shop.Set("OPPO","reno 3 Pro");
}else{
shop.Set("HUWEI","Mate 30 Pro");
}
}
}
}
//消费者类
class Customer implements