【发布时间】:2018-07-26 04:21:41
【问题描述】:
我们有广播服务,它维护着一个听众名单。广播者调用的方法是阻塞的。如何将其转换为异步或以非阻塞方式向所有侦听器发送事件。为每个调用创建线程是唯一的方法吗?
public class EventBroadCaster {
List<Listener> allListeners = new ArrayList();
private void sendEventToAll() {
for(Listener listener:allListeners)
listener.accept(String event);
}
}
public interface Listener {
public void accept(String event);
}
结构是这样的,问题是accept(String event) 方法被阻塞,EventBroadCaster 必须等到一个侦听器的accept 完成,然后再调用另一个侦听器的accept。 有没有办法让accept方法立即返回?
allListeners 中可以有 100 个 Listeners,不要为每个接受创建 100 个线程。
【问题讨论】:
-
你的问题不是很清楚,请详细说明
-
解释准确事件链是什么——什么叫什么,什么时候叫。什么方法在阻塞,它做了什么,它阻塞了什么?
-
你能提供一个minimal reproducible example吗?你应该在你的问题中edit它。
-
@AustineGwa 现在看起来还可以吗?
-
这听起来像是一个设计缺陷。您的接受方法阻塞!?您可以使用执行程序服务并使用多个线程进行调用。那么只要太多了,别挡住你的罚款。您也可以尝试使用并行流。
标签: java multithreading asynchronous