我在守护程序线程上有一个计时器,它不断地将数据写入SocketChannel
。在主类中,我没有这个套接字通道的对象引用,但我确实有这个套接字通道所连接的ServerSocket
的引用。所以我这样做是为了关闭频道。
socketChannel = serverSocket.accept();
socketChannel.close();
但是deamon线程的套接字通道关闭涉及延迟。虽然它们都引用相同的套接字通道,但是即使在调用上述close()
之后,定时器任务也会写入此套接字通道,直到几毫秒。
请建议如何确保完成关闭。这是一个非阻塞通道。
答案 0 :(得分:1)
您的代码没有意义。该代码根本不“引用相同的套接字通道”,因此它不会关闭它:它接受一个新的并关闭它,这也没有意义,至少不是对于制作的客户端这种新的联系并且可能期待一些服务,而不是立即关闭。
您只需要安排对需要关闭它的代码可用的现有通道的引用。这是编程101,几乎不是一个网络问题。
答案 1 :(得分:0)
您需要同步。在这些线程之间共享一些对象。然后你可以做这样的事情: 主线:
synchronized(object){
socketChannel = serverSocketChannel.accept()
socketChannel.close().
}
守护程序线程:
synchronized(object){
timerTask.write(socketChannel, data)
}