个人博客网站制作搭建,网站建设小公司生存,沙河网络推广,wordpress好看的中文主题我尝试用ArrayList做生产者-消费者问题#xff0c;有多个生产者#xff0c;多个消费者#xff0c;用wait、noitify、notifyAll做并发控制。当生产者生产完毕后#xff0c;如何只notify消费者呢#xff1f;你确保只有消费者在wait#xff0c;这样notify就只会通知消费者了…我尝试用ArrayList做生产者-消费者问题有多个生产者多个消费者用wait、noitify、notifyAll做并发控制。当生产者生产完毕后如何只notify消费者呢你确保只有消费者在wait这样notify就只会通知消费者了。话说你为什么要让生产者去wait呢给队列加一个锁lock然后创建两个Condition一个是full处理队列满的情况另一个是empty处理队列空的情况。操作流程是这样的生产者1、获得锁2、检查队列是否满如果满则等待full condition直到被消费者唤醒3、将元素加入队列4、notify empty condition唤醒一个消费者5、释放锁消费者1、获得锁2、检查队列是否空如果空则等待empty condition直到被生产者唤醒3、从队列中取出一个元素4、notify full condition唤醒一个生产者5、释放锁。牢记一点Condition不是锁不存在“锁定”Condition的情况。notify被唤醒的线程是随机的所以通常是没办法指定是谁被唤醒。根据我的知识水平我认为能做的办法有两点1.设置消费者线程的优先级使用notifyAll这样增大消费者线程获取资源的概率2.就是保证生产者执行完后正在wait的只有消费者class BoundedBuffer {final Lock lock new ReentrantLock();final Condition notFull lock.newCondition();final Condition notEmpty lock.newCondition();final Object[] items new Object[100];int putptr, takeptr, count;public void put(Object x) throws InterruptedException {lock.lock();try {while (count items.length)notFull.await();items[putptr] x;if (putptr items.length) putptr 0;count;notEmpty.signal();} finally {lock.unlock();}}public Object take() throws InterruptedException {lock.lock();try {while (count 0)notEmpty.await();Object x items[takeptr];if (takeptr items.length) takeptr 0;--count;notFull.signal();return x;} finally {lock.unlock();}}}无法指定线程notify会唤醒等待该对象的一个线程。无法指定线程notify会唤醒等待该对象的一个线程。