在给定时间间隔内在 Java 个线程中等待和通知
Wait and Notify in Java threads for a given interval
我正在处理一个用例,如下所示。我是多线程的新手,在使用它时遇到了这个问题。
- 我在网络上广播了一个活动。
- 所有听众都收到了,他们用他们的信息单播了我。
- 这是在回调方法中接收到的,如下所示,我将获得 N 个未知数量的回调线程。取决于当时的听众。
- 我必须收集所有订阅者的列表。
我必须至少等待 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.
}
我只关心如何.. ?
- 开始等待 sendMulticast 事件 X 秒
- 在所有收到的事件都添加到列表后,在 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() 每个线程都会等待。
- Start a wait at the sendMulticast event for X seconds
只需使用带有超时参数的 wait()
版本。
请注意,您应该在每次成功 wait()
调用(即 return 事件)后手动更新超时值。
- Notify at receiveEventsCallback() after all the recieved events has been added to the list.
您的问题坚持认为您不知道您的网络中有多少听众。你怎么知道,他们所有人都收到了事件(并回复)?
发件人的唯一方法是等待 X 秒并处理所有可用的回复。
我正在处理一个用例,如下所示。我是多线程的新手,在使用它时遇到了这个问题。
- 我在网络上广播了一个活动。
- 所有听众都收到了,他们用他们的信息单播了我。
- 这是在回调方法中接收到的,如下所示,我将获得 N 个未知数量的回调线程。取决于当时的听众。
- 我必须收集所有订阅者的列表。
我必须至少等待 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.
}
我只关心如何.. ?
- 开始等待 sendMulticast 事件 X 秒
- 在所有收到的事件都添加到列表后,在 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() 每个线程都会等待。
- Start a wait at the sendMulticast event for X seconds
只需使用带有超时参数的 wait()
版本。
请注意,您应该在每次成功 wait()
调用(即 return 事件)后手动更新超时值。
- Notify at receiveEventsCallback() after all the recieved events has been added to the list.
您的问题坚持认为您不知道您的网络中有多少听众。你怎么知道,他们所有人都收到了事件(并回复)?
发件人的唯一方法是等待 X 秒并处理所有可用的回复。