在给定时间间隔内在 Java 个线程中等待和通知

Wait and Notify in Java threads for a given interval

我正在处理一个用例,如下所示。我是多线程的新手,在使用它时遇到了这个问题。

  1. 我在网络上广播了一个活动。
  2. 所有听众都收到了,他们用他们的信息单播了我。
  3. 这是在回调方法中接收到的,如下所示,我将获得 N 个未知数量的回调线程。取决于当时的听众。
  4. 我必须收集所有订阅者的列表。

我必须至少等待 10 秒才能让所有订阅者回复我。

        //Sender

            public void sendMulticastEvent() {
                api.sendEvent();
                /* after sending event wait for 15 sec so call back can collect all the subscribers */
                //start waiting now
            }


    //Callback method
            public void receiveEventsCallback(final Event event) {
                //i will receive multiple response threads here..  
                //event object will have the topic and subscribers details, which i will collect here
               list.add(event)

               notify()
               //notify thread here so i have a cumulative list of all received events.
            }

我只关心如何.. ?

  1. 开始等待 sendMulticast 事件 X 秒
  2. 在所有收到的事件都添加到列表后,在 receiveEventsCallback() 处通知。

我认真阅读了等待和通知、倒计时和屏障。但是我不确定哪个好,因为我在多线程方面的经验很差。

如果您知道您将收到多少回复 - 假设每个回复都会触发新线程的创建 - 使用 CyclicBarrier。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html

示例:

CyclicBarrier barrier = new CyclicBarrier(3);

    Runnable thread = new Runnable()
    {
            @Override
            public void run()
            {
                    try
                    {
                            barrier.await();
                            for (int i = 0; i < 10; i++)
                            {
                                    System.out.printf("%d%n", i);
                            }
                    }
                    catch (InterruptedException | BrokenBarrierException ex)
                    {
                            ex.printStackTrace();
                            // handle the exception properly in real code.
                    }

            }
    };

直到第三个 barrier.await() 每个线程都会等待。

  1. Start a wait at the sendMulticast event for X seconds

只需使用带有超时参数的 wait() 版本。

请注意,您应该在每次成功 wait() 调用(即 return 事件)后手动更新超时值。

  1. Notify at receiveEventsCallback() after all the recieved events has been added to the list.

您的问题坚持认为您不知道您的网络中有多少听众。你怎么知道,他们所有人都收到了事件(并回复)?

发件人的唯一方法是等待 X 秒并处理所有可用的回复。