2010-02-19 46 views
1

在Java中使用NIO套接字时,一旦连接,我既可以注册读写操作,也可以在收到写入通知时不做任何事情,出站缓冲区中没有任何内容,或者我只能注册读取通知,并且只有在出站缓冲区中放置了某些内容时才重新注册读取和写入。我倾向于后者,但我关心两件事。使用NIO套接字时读取和写入的注册策略

  • 经常重新注册感兴趣的操作是否会导致任何显着的性能损失?
  • 将感兴趣的操作重新注册到另一个线程中,而不是执行IO操作的线程会造成任何问题?

编辑:

其实另一个发生在我。为了正常工作,我需要打开将出站数据添加到套接字的线程中的写入注册,并且在通信线程中,当出站队列为空时,我需要关闭写入注册。然而,这也开启了以下情形

 IO Thread         Other Thread 
    Check if buffer empty 
               Add Item to buffer 
              Register for write notification 
Turn off write notifications 

我看到避免这种情况是开启线程同步的缓存本身,以便修改(或检查)的缓冲和注册的改变基于这一点的唯一途径成为一个原子操作。

回答

0

你已经基本明白了。您希望打开和关闭写入兴趣,并且需要同步(或单线程)。另一点:只要你在你的“其他线程”锁定,你应该尝试写作,然后再打开兴趣。非阻塞写入通常会成功,您将获得效率。他们会让你更多地认识你。

+0

如果我需要保留字节输出的顺序,我看不出如何工作。在我甚至可以尝试发送我试图添加到缓冲区的数据之前,我必须清空出站缓冲区。我会牢记这一点,并会在确定发送代码的复杂性之后,看看这是多么可行。 – Jherico 2010-02-19 01:58:29

+0

是的,你必须按顺序写。但是,由于你已经锁定了缓冲区,你可以尝试在缓冲区中写入第一个数据,而不是将数据添加到缓冲区的末尾(除非它是唯一的数据)。 – Darron 2010-02-19 16:29:59