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

时间:2013-03-14 16:35:02

标签: java multithreading event-handling nio

我必须编写一个管理多个Datagram套接字的服务器。 我知道java.nio的选择器功能允许异步管理不同的套接字 但是,在解析了消息之后,我需要将事件激发到另一个线程(可选地带有一些参数)。 有没有办法让其他线程“注册”到管理套接字的那个线程并让他们意识到数据已经准备好了? 提前致谢

1 个答案:

答案 0 :(得分:2)

您可以使用具有支持异步网络调用的ExecutorService。在那时返回的未来可以在完成时充当消息传递者。

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

的实例