我正在使用如下的用例。我是多线程的新手,并且在使用它时遇到了这个问题。
我必须等待至少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.
}
我只关心如何......?
我已经在等待和通知,Countdownlatch和Barrier上阅读了理论。但由于我在多线程方面的经验不足,我不确定哪个会好。
答案 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)
- 在sendMulticast事件中等待X秒
醇>
只需使用带有超时参数的wait()
版本。
请注意,您应该在每次成功wait()
调用后手动更新超时值(即返回事件)。
- 将所有收到的事件添加到列表后,在receiveEventsCallback()处通知。
醇>
您的问题坚持认为您不知道网络中有多少听众。你怎么知道,所有人都收到了事件(并回复了)?
发送方的唯一方法是等待X秒并处理所有可用的回复,直到那一刻。