Java NIo 筆記001

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,則該通道會被關閉。

相關文章
相關標籤/搜索