欢迎使用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,用于执行异步IO操作的时候实用。    ChannelFuture提供了几种额外的方法,这些方法使得我们可以注册一个或者多个ChannelFutureListener实例,监听器的回调方法operationComplete(),将会在对应的操作完成时被调用,然后监听器可以判断该操作是成功地完成了,还是出错了,如果是后者,我们可以检索产生的Throwable。简而言之,由ChannelFutureListener提供的通知机制消除了手动检查对应操作是否完成的必要。
每个Netty的出站I/O操作都将返回一个ChannelFuture;也就是说,他们都不会阻塞。
原创粉丝点击