阻塞非阻塞:

NIO中的Channel主要分为两大类:一类是FileChannel,另一类是SocketChannel。NIO提供的核心非阻塞特性主要针对SocketChannel类,全部socket通道类(DatagramChannel、SocketChannel和ServerSocketChannel)都是由位于java.nio.channels.spi包中的AbstractSelectableChannel引申而来。这意味着我们可以用一个Selector对象来执行socket通道的有条件的选择(readiness selection)。

SelectableChannel抽象类提供的方法:

  请注意DatagramChannel和SocketChannel实现定义读和写功能的接口而ServerSocketChannel不实现。ServerSocketChannel负责监听传入的连接和创建新的SocketChannel对象,它本身从不传输数据。全部socket通道类(DatagramChannel、SocketChannel和ServerSocketChannel)在被实例化时都会创建一个对等socket对象。这些是我们所熟悉的来自java.net的类(Socket、ServerSocket和DatagramSocket),它们已经被更新以识别通道。对等socket可以通过调用socket( )方法从一个通道上获取。此外,这三个java.net类现在都有getChannel( )方法。

  虽然每个socketChannnel(在java.nio.channels包中)都有一个关联的java.net socket对象,却并非所有的socket都有一个关联的通道。如果您用传统方式(直接实例化)创建了一个Socket对象,它就不会有关联的SocketChannel并且它的getChannel( )方法将总是返回null。

示例代码:

    @Test
public void socketTest() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8080);
} catch (IOException e) {
e.printStackTrace();
}
ServerSocketChannel channel = serverSocket.getChannel();
assert (channel == null);
}

  SocketChannel委派协议操作给对等socket对象。如果在通道类中存在似乎重复的socket方法,那么将有某个新的或者不同的行为同通道类上的这个方法相关联。

非阻塞模式:

  默认为阻塞模式,示例如下:

    @Test
public void socketChannelTest() throws Exception {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(8080));
assert (ssc.isBlocking());
ssc.configureBlocking(false);
assert (!ssc.isBlocking()); SocketChannel sc = SocketChannel.open();
sc.connect(new InetSocketAddress("localhost", 8080)); }
configureBlocking()是阻塞操作

阻塞非阻塞开关锁:

  我们也会需要防止socket通道的阻塞模式被更改。API中有一个blockingLock( )方法,该方法会返回一个非透明的对象引用。返回的对象是通道实现修改阻塞模式时内部使用的。只有拥有此对象的锁的线程才能更改通道的阻塞模式(对象的锁是用同步的Java密码获取的)。对于确保在执行代码的关键部分时socket通道的阻塞模式不会改变以及在不影响其他线程的前提下暂时改变阻塞模式来说,这个方法都是非常方便的。

代码示例:

    /**
* configureBlocking Test
* @throws Exception
*/
@Test
public void socketChannelConfigureBlockingTest() throws Exception {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(8080));
assert (ssc.isBlocking());
ssc.configureBlocking(false);
assert (!ssc.isBlocking());
Object lock = ssc.blockingLock();
Thread thread = new Thread(()->{
Date date = new Date();
try {
TimeUnit.SECONDS.sleep(3);
date = new Date();
//阻塞操作
ssc.configureBlocking(true);
} catch (Exception e) {
e.printStackTrace();
assert (false);
}
assert (ssc.isBlocking());
assert (new Date().getTime()-date.getTime()>=6000);
});
thread.start();
synchronized (lock){
TimeUnit.SECONDS.sleep(10);
}
thread.join();
}

最新文章

  1. yii2 model层中配置常量与list
  2. 【Android测试】【随笔】Android Studio环境搭建
  3. SEO之HTML优化:让你的网站HTML代码更符合SEO规范
  4. wex5 教程之 图文讲解 Cloudx5一键部署
  5. zw版【转发·台湾nvp系列Delphi例程】HALCON TestObjDef
  6. *[codility]CartesianSequence
  7. ZOJ1109_Language of FatMouse(STL/map)
  8. PHPExcel的读取excel的操作
  9. 生成 git 密钥 步骤
  10. ISO14443标准详细介绍
  11. MooTools,jQuery库的一些比对
  12. OWIN– 解耦,协作和开放
  13. Oracle 使用sql创建表空间及用户
  14. swift pod第三方OC库使用use_frameworks!导致#import提示无法找到头文件
  15. 快速理解高性能HTTP服务端的负载均衡技术原理(转)
  16. linux常见问题解决
  17. Java学习之模拟纸牌游戏,List的ArrayList,Map的HashMap,重写Collections类的sort方法对指定类进行通过特定属性排序,输入异常处理等的学习
  18. 测试人员需要了解的sql知识(提高篇)
  19. vlan配置命令
  20. 在Spark中尽量少使用GroupByKey函数(转)

热门文章

  1. localStorage&sessionStorage&Cookie
  2. VLC祥解
  3. 笔谈AudioToolbox(一)
  4. springdata jpa 关于分页@Query问题
  5. 【Intellij Idea】Intellij Idea 某个提示功能disable,想恢复怎么做
  6. Qt编译出错 GL/gl.h:No such file or directory
  7. fastJSON的常用方法总结
  8. Python包模块化调用方式详解
  9. selenium+python自动化99-清空输入框clear()失效问题解决
  10. 项目Alpha冲刺——测试