zoukankan      html  css  js  c++  java
  • Java NIo 笔记001

    1. Channel

    Channel接口只提供了两个方法:

    package java.nio.channels;

    public interface Channel {
      public boolean isOpen( );
      public void close( ) throws IOException;
    }

    调用close()可能会造成阻塞,如果同一个Channel上多次调用close()也没有什么问题,如果第一次调用阻塞了,后续的调用都会阻塞,知道第一次调用关闭,

    此时,后续的调用将不执行任何操作,马上返回。


    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就不是了。

    从FileInputStream对象的getChannel( )方法获取的FileChannel对象是只读的,尽管获取到的Channel也是实现了write方法,

    FileChannel实现ByteChannel接口。在这样一个通道上调用write( )方法将抛出未经检查的NonWritableChannelException异常,

    因为FileInputStream对象总是以read-only的权限打开文件。

    3 对于线程中断异常的解释

    如果一个通道实现InterruptibleChannel接口,它的行为以下述语义为准:

    如果一个线程在一个通道上被阻塞并且同时被中断(由调用该被阻塞线程的interrupt( )方法的另一个线程中断),那么该通道将被关闭,

    该被阻塞线程也会产生一个ClosedByInterruptException异常。

    此外,假如一个线程的中断状态被设置,并且该线程试图访问一个通道,那么这个通道将立即被关闭,同时将抛出相同的ClosedByInterruptException异常。

    线程的中断状态在线程的interrupt( )方法被调用时会被设置。我们可以使用isInterrupted( )来测试某个线程当前的中断状态。

    当前线程的中断状态可以通过调用静态的Thread.interrupted( )方法清除。

    不要将在Channels上休眠的中断线程同在Selectors上休眠的中断线程混淆。前者会关闭通道,而后者则不会。

    不过,如果您的线程在Selector上休眠时被中断,那它的中断状态将会被设置。假设那个线程接着又访问一个Channel,则该通道会被关闭。

  • 相关阅读:
    Ping pong
    [NOIp2015普及组]推销员
    [模板]树状数组
    [洛谷201704R1]开心派对小火车
    洛谷P3515 [POI2011]Lightning Conductor(决策单调性)
    bzoj1560:[JSOI2009]火星藏宝图(斜率优化)
    (转载)行走在镜面的边缘
    洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)
    洛谷P4072 [SDOI2016]征途(斜率优化)
    洛谷P3648 [APIO2014]序列分割(斜率优化)
  • 原文地址:https://www.cnblogs.com/java-boy/p/3554991.html
Copyright © 2011-2022 走看看