在Java线程中等待并通知给定的时间间隔

时间:2015-06-08 14:03:40

标签: java multithreading thread-safety wait notify

我正在使用如下的用例。我是多线程的新手,并且在使用它时遇到了这个问题。

  1. 我在网络上播放了一个活动。
  2. 所有听众都收到了,并且他们将他们的信息单播给我。
  3. 这是在回调方法中收到的,如下所示,我将获得N个未知数量的回调线程。取决于特定时间的听众。
  4. 我必须收集所有订阅者的列表。
  5. 我必须等待至少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()处通知。
    3. 我已经在等待和通知,Countdownlatch和Barrier上阅读了理论。但由于我在多线程方面的经验不足,我不确定哪个会好。

2 个答案:

答案 0 :(得分:0)

如果您知道将获得多少回复 - 假设每个响应都会触发创建新线程 - 请使用CyclicBarrier。

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

示例:

SELECT airports.NAME 
FROM airports 
INNER JOIN
(
    SELECT `FROM`, COUNT(*) AS flights_from_count
    FROM FLIGHT_PROFILES
    GROUP BY `FROM`
) sub2 ON airports.IATA_CODE = sub2.`FROM` 
INNER JOIN 
(
    SELECT MAX(flights_from_count) AS max_flights_from_count
    FROM
    (
        SELECT `FROM`, COUNT(*) AS flights_from_count
        FROM FLIGHT_PROFILES
        GROUP BY `FROM`
    ) sub1
) sub3
ON sub2.flights_from_count = sub3.max_flights_from_count

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

答案 1 :(得分:0)

  
      
  1. 在sendMulticast事件中等待X秒
  2.   

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

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

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

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

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