Java - 在数据接收时向另一个线程触发事件

标签 java multithreading event-handling nio

我必须编写一个管理多个数据报套接字的服务器。 我知道 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/

相关文章:

c++ - Winsock2 监听循环

python - 如何有效地利用多处理和多线程并行使用 python 将 1000 个视频文件转换为音频

javascript - 如何构建类似 jQuery 的事件?

java - 在 Websphere 8.5.5.10 中添加 TLS 1.2 后出现 Unsupported SignatureAndHashAlgorithm 错误

java - 使用 BufferedReader 将字符串转换为 int

java - 使用 Serializable 的副作用?

java - Libgdx 矩形检测触摸

linux - 如何从多线程 C++ Linux 应用程序安全地运行 shell 脚本?

javascript - Highcharts 选择事件禁用突出显示效果

ios - 在 UIGestureRecognizer 事件处理程序中获取指向事件目标的指针