赞
踩
假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费
如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止
如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止
这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件
对于生产者,没有生产产品之前,要通知消费者等待。而生产了产品之后,又需要马上通知消费者消费
对于消费者,在消费之后,要通知生产者已经消费结束,需要继续生产新产品以供消费
在生产者消费者问题中,仅有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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。