1. Channeljava
Channel接口只提供了兩個方法:socket
package java.nio.channels;
public interface Channel {
public boolean isOpen( );
public void close( ) throws IOException;
}
調用close()可能會形成阻塞,若是同一個Channel上屢次調用close()也沒有什麼問題,若是第一次調用阻塞了,後續的調用都會阻塞,知道第一次調用關閉,測試
此時,後續的調用將不執行任何操做,立刻返回。spa
2. ByteChannel線程
public interface ReadableByteChannel extends Channel { public int read (ByteBuffer dst) throws IOException; } public interface WritableByteChannel extends Channel { public int write (ByteBuffer src) throws IOException; }
//ByteChannel自己沒有新增任何方法,繼承了可讀和可寫的接口 public interface ByteChannel extends ReadableByteChannel, WritableByteChannel {
}
基本上全部的file和socket都實現了這三個接口,因此file和socket通道對象都是雙向的,通常來講socket是雙向的,可是file就不是了。code
從FileInputStream對象的getChannel( )方法獲取的FileChannel對象是隻讀的,儘管獲取到的Channel也是實現了write方法,對象
FileChannel實現ByteChannel接口。在這樣一個通道上調用write( )方法將拋出未經檢查的NonWritableChannelException異常,blog
由於FileInputStream對象老是以read-only的權限打開文件。繼承
3 對於線程中斷異常的解釋接口
若是一個通道實現InterruptibleChannel接口,它的行爲如下述語義爲準:
若是一個線程在一個通道上被阻塞而且同時被中斷(由調用該被阻塞線程的interrupt( )方法的另外一個線程中斷),那麼該通道將被關閉,
該被阻塞線程也會產生一個ClosedByInterruptException異常。
此外,假如一個線程的中斷狀態被設置,而且該線程試圖訪問一個通道,那麼這個通道將當即被關閉,同時將拋出相同的ClosedByInterruptException異常。
線程的中斷狀態在線程的interrupt( )方法被調用時會被設置。咱們可使用isInterrupted( )來測試某個線程當前的中斷狀態。
當前線程的中斷狀態能夠經過調用靜態的Thread.interrupted( )方法清除。
不要將在Channels上休眠的中斷線程同在Selectors上休眠的中斷線程混淆。前者會關閉通道,然後者則不會。
不過,若是您的線程在Selector上休眠時被中斷,那它的中斷狀態將會被設置。假設那個線程接着又訪問一個Channel,則該通道會被關閉。