《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() {
            }
        };
    }
}