Java: Excutive Framework
Intro在线程的基础上,Java 引入了更高级别的抽象来简化构建并发型应用程序的过程。
通过这些抽象,我们不需要显式地处理线程,只需要专注于我们的任务,让 Java 来处理线程操作。
Thread Pools线程是构建并发程序模块的基础,但是直接使用线程有两个问题:
Availability:我们可以使用的线程数量有限,如果不小心创建了过多的线程,程序就会崩溃
Cost:创建一个独立的线程的开销很大
Java 为了解决开销大的问题,提出了一种称为线程池的解决方案。
线程池本质上就是一池子线程,这个池子里的线程被称为 Worker Thread,这些线程可以被多次使用,从而一个线程就可以执行多次任务。如果一个工作线程的任务完成了,它就会被放回线程池,这样就可以重新用它来执行另一个任务。所以这些线程没有被销毁和重新创建,从而能减小开销。
同时,因为线程池中的线程数量是一定的,所以我们不必担心创建了太多的线程,以至于内存不够用。
比如说,我们可以创建一个有 10 个线程的线程池,再给这个线程池分配 1000 个任务,那线程池就会负责给每个线程分配任务。如果所有的线程都在执行任务,那新的 ...
Java: Concurrency and Multi-threading
Intro现在大多数计算机都有多核处理器,可以并行执行多个任务。这一章要讲的就是如何在代码中利用多核处理器,这能提升程序的响应速度。
Processes and Threads进程(process)是一个程序(program)或一个应用(application)的实例。当启动一个应用程序(如代码编辑器或音乐播放器)时,操作系统就会把这个应用加载到一个进程中,因此一个进程包含着这这个应用的代码的映像,它有一些内存和一些其他资源。
你的操作系统可以同时执行多个进程。例如,它可以在播放音乐的同时运行杀毒软件,这就是进程级的并发。但也可以在进程内或使用线程的应用中使用并发。
技术上来说,线程是指令序列(a sequence of instructions),它就像一条指令线。现实点说,线程就是执行代码的东西。
每个进程至少调用一个线程,称为主线程。但我们也可以创造额外的线程去同时执行多个任务。例如我们可以创建一个可以一同时服务多个用户的 web 服务器,我们将使用一个单独的线程为每个客户端服务。或者我们可以构建一个可以同时下载多个文件的应用程序,让每个线程下载一个单独的文件。这就是多线程。
如 ...
Java: Streams
IntroStream 允许我们以声明式编程的方式来处理数据集。
Imperative VS Functional Programming假设我们有一个电影列表,我们想知道有多少个电影超过十个赞。
先有 Movie 类:
1234567891011121314public class Movie { private String title; private int likes; public Movie(String title, int likes) { this.title = title; this.likes = likes; } public int getLikes() { return likes; }}
然后进行如下操作:
123456789101112131415public class StreamDemo { public static void show() { List<Mov ...
Java: Lambda Expressions and Functional Interfaces
Functional InterfacesA functional interface is a interface with a single abstract method.
之前提过的 Comparable 接口就只有一个 compareTo 方法,所以它就是一个 functional interface。
Comparator 接口虽然有很多方法,但只有 compare 方法没有默认实现,所以它也是一个 functional interface。
创建包 lambdas,类 LambdasDemo 以及接口 Printer。
123public interface Printer { void print(String message);}
作为一个接口,Printer 可能有不同的实现。
123456public class ConsolePrinter implements Printer{ @Override public void print(String message) { System.out ...
Java: Collections
Intro
上图是集合框架的概述,其中绿色的是接口,蓝色的是类。
顶部的 Iterable 接口,实现这个接口的类都可以被用于 for 循环。
下面的 Collection 接口继承了上面的 Iterable 接口。实现这个接口的类都可以充当容器,或表示一些对象的集合。它实现的功能有添加(add),移除(remove),检查对象是否存在(contains),清空(clear)等等。
接下来是 Collection 的三个子接口,列表(List)、队列(Queue)和集合(Set)。
List 允许我们使用有序集合,并使用对象的索引访问对象,就像我们在数组(Array)中做的那样。
ArrayList 是动态数组。它在内部用数组来存储对象,如果数组已满,它会自动扩充(resize)。
LinkedList 是基于链表的数据结构。
Queue 使用的情况通常是分配共享资源。比如说一个打印机一次只能打印一张纸,我们就需要把任务放入队列,然后打印机就可以一个接着一个地完成任务。
Set 表示一个没有重复元素的集合。
The Need for Iterables准确地说,Iterable 接口不 ...