1 Netty--异步和事件驱动
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
闭包包含自由(未绑定到特定对象)变量,这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。
闭包就是一个代码块,用“{ }”包起来。此时,程序代码也就成了数据,可以被一个变量所引用(与C语言的函数指针比较类似)。
闭包的最典型的应用是实现回调函数(callback)。
public class ConnectExample { private static final Channel CHANNEL_FROM_SOMEWHERE = new NioSocketChannel(); /** * 代码清单 1-3 异步地建立连接 * * 代码清单 1-4 回调实战 * */ public static void connect() { Channel channel = CHANNEL_FROM_SOMEWHERE; //reference form somewhere // Does not block //异步地连接到远程节点 ChannelFuture future = channel.connect(new InetSocketAddress("127.0.0.1", 3333)); //注册一个 ChannelFutureListener,以便在操作完成时获得通知 future.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) { //检查操作的状态 if (future.isSuccess()) { System.out.println("ok"); //如果操作是成功的,则创建一个 ByteBuf 以持有数据 ByteBuf buffer = Unpooled.copiedBuffer("Hello\n", Charset.defaultCharset()); //将数据异步地发送到远程节点。返回一个 ChannelFuture ChannelFuture wf = future.channel().writeAndFlush(buffer); // ... } else { //如果发生错误,则访问描述原因的 Throwable Throwable cause = future.cause(); cause.printStackTrace(); } } }); } public static void main(String[] args){ ConnectExample.connect(); } }