繁体   English   中英

在给定间隔内在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()处进行通知。

我已经阅读了有关等待和通知的理论文章,Countdownlatch和Barrier。 但是由于我在多线程方面的经验不足,我不确定哪种方法会好。

如果您知道将收到多少答复(假设每个答复都会触发创建新线程),请使用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. 在sendMulticast事件上等待X秒

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

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

  1. 将所有收到的事件添加到列表后,在receiveEventsCallback()处进行通知。

您的问题是您不知道网络中有多少听众。 您怎么知道他们都收到(并回复)了事件?

发件人的唯一方法是等待X秒,然后处理所有可用的回复,直到那一刻。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM