Java在二十多年前首次发布时的最重要贡献之一是方便地访问线程和同步原语。Java线程(直接使用或间接通过例如处理HTTP请求的Java servlets)为编写并发应用程序提供了相对简单的抽象。然而,现今编写满足当前需求的并发程序的主要困难之一是,运行时提供的并发软件单元 — 线程 — 无法匹配域的并发单元的规模,无论是用户、事务还是单个操作。即使应用程序并发的单位粗略 — 例如,由单个套接字连接表示的会话,服务器可以处理多达一百万个并发打开的套接字,但Java运行时(用于Java线程实现的操作系统线程)却不能有效地处理几千个以上。好几个数量级的不匹配会产生重大影响。
虽然使用内核线程作为Java线程的实现有一些优点 — 最明显的是所有本地代码都由内核线程支持,因此在线程中运行的Java代码可以调用本地API — 但上述缺点太大,无法忽视,可能导致难以编写、昂贵维护的代码,或者导致计算资源的显著浪费,特别是当代码在云中运行时。的确,有些语言和语言运行时成功地提供了轻量级线程实现,最著名的是Erlang和Go,这个特性非常有用和受欢迎。
因此,我们希望引入一种“轻量级的线程”,我们称之为纤程的轻量级线程构造,由Java运行时管理,可以选择性地与现有的沉重的、操作系统提供的线程实现一同使用。纤程在内存占用方面比内核线程更轻,它们之间的任务切换开销接近于零。一个JVM实例中可以生成数百万个纤程,程序员不必犹豫发出同步、阻塞调用,因为阻塞将几乎是免费的。除了使并发应用程序更简单和/或更可扩展外,这还将使库作者的生活更轻松,因为不再需要为不同的简单性/性能权衡提供同步和异步API。简单性将没有权衡。
正如我们将看到的,线程不是一个原子构造,而是两个关注点的组合 — 调度器和延续。我们当前的意图是分离这两个关注点,并在这两个构建块之上实现Java纤程。