关闭ServerSocketChannel.accept()检索的SocketChannel

时间:2011-08-27 14:23:54

标签: java

我在守护程序线程上有一个计时器,它不断地将数据写入SocketChannel。在主类中,我没有这个套接字通道的对象引用,但我确实有这个套接字通道所连接的ServerSocket的引用。所以我这样做是为了关闭频道。

socketChannel = serverSocket.accept();
socketChannel.close();

但是deamon线程的套接字通道关闭涉及延迟。虽然它们都引用相同的套接字通道,但是即使在调用上述close()之后,定时器任务也会写入此套接字通道,直到几毫秒。

请建议如何确保完成关闭。这是一个非阻塞通道。

2 个答案:

答案 0 :(得分:1)

您的代码没有意义。该代码根本不“引用相同的套接字通道”,因此它不会关闭它:它接受一个新的并关闭它,这也没有意义,至少不是对于制作的客户端这种新的联系并且可能期待一些服务,而不是立即关闭。

您只需要安排对需要关闭它的代码可用的现有通道的引用。这是编程101,几乎不是一个网络问题。

答案 1 :(得分:0)

您需要同步。在这些线程之间共享一些对象。然后你可以做这样的事情: 主线:

synchronized(object){
    socketChannel = serverSocketChannel.accept()
    socketChannel.close(). 
}

守护程序线程:

synchronized(object){
    timerTask.write(socketChannel, data)
}