java的notify/notifyAll:如何notify指定的线程?

发布于 2022-08-29 16:32:58 字数 108 浏览 18 评论 0

我尝试用ArrayList做生产者-消费者问题,有多个生产者,多个消费者,用wait、noitify、notifyAll做并发控制。

当生产者生产完毕后,如何只notify消费者呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

冧九 2022-09-05 16:32:58

你确保只有消费者在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的情况。

内心激荡 2022-09-05 16:32:58
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();
     }
   }
 }
情话墙 2022-09-05 16:32:58

notify被唤醒的线程是随机的,所以通常是没办法指定是谁被唤醒。
根据我的知识水平,我认为能做的办法有两点:
1.设置消费者线程的优先级,使用notifyAll,这样增大消费者线程获取资源的概率;
2.就是保证生产者执行完后,正在wait的只有消费者;

夏日浅笑〃 2022-09-05 16:32:58

无法指定线程,notify会唤醒等待该对象的一个线程。

南冥有猫 2022-09-05 16:32:58

无法指定线程,notify会唤醒等待该对象的一个线程。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文