我必须编写一个管理多个数据报套接字的服务器。 我知道 java.nio 的选择器功能允许异步管理不同的套接字 但是,在解析消息后,我需要向另一个线程触发一个事件(可选地带有一些参数)。 有没有一种方法可以让其他线程“注册”到管理套接字的线程并让它们知道数据已准备好? 提前致谢
最佳答案
您可以使用 ExecutorService 来支持异步网络调用。此时返回的 Future 可以在完成时充当消息传递者。
public class SocketWork<T>{
private final ExecutorService service = Executors.newSingleThreadExecutor();
private final Future<T> future;
public SocketWork(){
future = service.submit(new SocketWorkCallable<T>());
}
public T register(){
// all threads entering register will block until
// the SocketWorkCallable is completed and returns.
return future.get();
}
}
另一种方法是使用 CountdownLatch。
public class SocketWork<T>{
private final CountdownLatch latch = new CountdownLatch(1);
private T message;
public void executeSocketWork(){
//execute work and get message
this.message = returnedMessage;
latch.countDown();
}
public T register(){
latch.await();
return message;
}
}
您也可以使用 ReadWriteLock 执行类似的操作。
正如您所想象的,这仅适用于单个任务。每个 SocketWork 实例
关于Java - 在数据接收时向另一个线程触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15415026/