2012-02-02 166 views
0

我想在寫入字符串byebye後關閉Java非阻塞套接字通道。但是,非阻塞模式下的方法會立即返回,所以調用close()可能會導致正在進行的寫操作拋出ClosedChannelException關閉非阻塞套接字通道

我能想到的解決方法2:

  1. 彈出一個線程和關閉之前等待幾毫秒。
  2. 轉爲關閉之前阻塞模式,但Java doc says

    「A信道必須被放置到非阻塞模式與一選擇器註冊之前,並直到它已被註銷可能不會返回到阻塞模式」

無論如何,我覺得這兩種方式都很髒。有沒有一種優雅的方式來處理這個問題?

代碼:

String msg = "byebye"; 
channel.write(ByteBuffer.wrap(msg.getBytes())); 
channel.close(); 

回答

1

調用close()可能會導致經受寫入操作拋出 ClosedChannelException。

沒有也不會。 write()方法拋出。一旦write()方法退出,它就不能被拋出。數據保留在內核的套接字輸出緩衝區中進行寫入。