《Java8函数式编程》学习笔记 - 第9章
第9章 使用Lambda表达式编写并发程序
前面的章节介绍如何并行化处理出具,本章讨论如何使用Lambda表达式编写并发应用,
高效传递信息和非阻塞式I/O
为什么要使用非阻塞式I/O
使用传统线程模型,每次向用户写数据时,都要调用一个方法向用户传输数据,
这个方法会阻塞当前流程。
这种方式叫阻塞式I/O,是一种通用且易于理解的方式。因为和程序用户的交互通常
符合这样一种顺序执行的方式。
缺点是将系统扩展至支持大量用户时,需要和服务器建立大量TCP连接,因此扩展性不是很好。
非阻塞式I/O,有时也叫异步I/O,可以处理大量并发网络连接,而且一个线程可以为多个连接服务。
和阻塞式I/O不同,对聊天程序客户端的读写调用立即返回。
真正的读写操作则在另一个独立的线程执行,这样就可以同时执行其他任务了。
Java标准类库的NIO提供了非阻塞式I/O的接口,NIO的最初版本用到了Selector的概念,
让一个线程管理多个通信管道,比如向客户端写数据的网络套接字。
然后这种方式没有在Java程序员中流行起来,它编写出来的代码难于理解和调试,
引入Lambda表达式之后,设计和实现没有这些缺点的API就顺手多了。
9.2 回调
public class ChatVerticle extends Verticle { public void start() { vertx.createNetServer() .connectHandler(socket -> { container.logger().info("socket connected"); socket.dataHandler(new User(socket, this)); }).listen(10_000); container.logger().info("ChatVerticle started"); } }
well encapasulated是指所有成员变量都是private,都只能通过public成员方法访问。 char可以作为int,传给int形参的方法。 primitive中,char型和int型可以互转。 既然有default constructor了,说明本身就没有其他构造方法,那自然是没有overload一说的。
数组的初始化可以是空的大括号,表示不初始化。 多维数组初始化时,如果前面没有初始化,则后面初始化也没有。 int x = new int 第一个必须被初始化,前面一个是空,后面一个初始化了这种情况不被允许。 int[1][][1]是不行的。
父类成员方法即使不throws任何Exception,
子类override的成员方法也可以随意throws RuntimeException
throw Exception()这个格式表示的是某个名为Exception的方法,其返回值是一个Exception类。
然后把返回的这个Exception throw出去。
跟throw new Exception()是一个意思。
int[] x = new int[5]; x = new int[]{1,2,3,4}; int y = x[1]+ x[0]-- /x[0] * x[4]; System.out.println(y);
当中是自减1之后再去除以,因此抛ArithmeticException
如果第一位1⇒2,那么就是ArrayIndexOutOfBoundsException
interface里的print方法缺省是public abstract,
因此在实现该方法时候必须是public,这是根据override原则子类方法必须比父类方法范围更宽。
数组不可以指定index并且同时初始化 int[] x = new int[2]{1,2}就是错的。
be c d b cd a d acd ac h j 14 c 1+3+4 15 d 16 d 17 a 18 d 19 aeg 20 ab 21 bd
嵌套类定义在另一个类的内部。
inner class 内部类
static nested classes 静态嵌套类
member nested class(成员嵌套类):
成员嵌套类作为enclosing class的成员定义的,成员嵌套类有enclosing class属性local nested class (局部嵌套类):
局部嵌套类定义在enclosing class的方法里面,
局部嵌套类有enclosing class属性和enclosing method属性anonymous nested class(匿名嵌套类):
匿名嵌套类没有显示的定义一个类,直接通过new的方法创建类的实例。
一般回调模式情况下使用的比较多
public class EnclosingClass { public static final class NestedMemberClass { } public void nestedLocalClass() { final class NestedLocalClass { } } public void nestedAnonymousClass() { new Runnable() { @Override public void run() { } }; } }