欢迎使用CSDN-markdown编辑器
来源:互联网 发布:gopro 软件 编辑:程序博客网 时间:2024/06/07 18:28
Netty学习日记【1】——基础控件篇
重点内容
Channel
首先,Channel英文翻译为航道。在理解框架的过程中,一般的命名不是随便乱取的,那么这个翻译词:航道 可以作为入门的第一印象,Channel第一印象就是与运输有关系,那么带着第一印象,我发现Channel其实是传入与传输的载体。
它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执
行一个或者多个不同的I/O操作的程序组件)的开放连接,如读操作和写操作 。
回调
如果有前端开发经验,那么对于回调这一概念并不陌生,回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法调用,在实际场景中,回调往往提示操作完成后通知相关方的常见方式。
在ChannelHandler内里面channelActive()就是常见的回调方法
Future
Future提供了另外一种在操作完成时通知应用程序的方式,这个对象可以看作是一个异步操作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。
Future源自interface java.util.concurrent.Future,但其提供的实现只允许手动检查对应的操作是否已经完成,或者一直堵塞到它完成为止。
顺便回顾下concurrent.Future 内容
Future的重要方法包括get()和cancel(),get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据,而 cancel()是取消数据加载。另外一个get(timeout)操作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞。
final ExecutorService exec = Executors.newFixedThreadPool(5); Callable call = new Callable(){ public String call() throws Exception{ Thread.sleep(1000 * 5); return "Other less important but longtime things."; } }; Future task = exec.submit(call); //重要的事情 Thread.sleep(1000 * 3); System.out.println("Let's do important things."); //其他不重要的事情 String obj = (String)task.get(); //检查task是否完成 System.out.println(obj); //关闭线程池 exec.shutdown();
这样可以在多线程中动态的去get Future完成的点,可以是任何类型,但是由上面的代码可以看出Future在线程池里面执行的时候是阻塞的,那么不符合netty中NIO特性(NONBLOCK)。由此netty提供了其实现方式ChannelFuture,用于执行异步I/O操作的时候实用。 ChannelFuture提供了几种额外的方法,这些方法使得我们可以注册一个或者多个ChannelFutureListener实例,监听器的回调方法operationComplete(),将会在对应的操作完成时被调用,然后监听器可以判断该操作是成功地完成了,还是出错了,如果是后者,我们可以检索产生的Throwable。简而言之,由ChannelFutureListener提供的通知机制消除了手动检查对应操作是否完成的必要。
每个Netty的出站I/O操作都将返回一个ChannelFuture;也就是说,他们都不会阻塞。
阅读全文
0 0
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- Network Saboteur(dfs)
- OpenResty普通模块与实例化模块
- 实习心得-链家网
- Python 快速入门
- 【jzoj5231】【NOIP2017模拟A组模拟8.5】【序列问题】 【分治】
- 欢迎使用CSDN-markdown编辑器
- pip国内源
- openfire+XMPP实现即时通讯
- 练习 2-1 编写一个程序以确定分别由signed及unsigned 限定的char、short、int与long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- C语言:斗地主发牌程序
- WideCharToMultiByte 和 MultiByteToWideChar 之 codePage 参数(二)
- day5作业:购物车(1)
- 最近公共祖先LCA
- Hadoop数据操作系统YARN全解析