跳到主要内容

事件链接

概述#

Eventloop模块是其他模块的基础,这些模块在事件循环和线程内异步运行其代码。 它 ,对异步操作进行有效管理,没有多线程开销。 特别有用的是 ,用于构建具有高性能要求的客户-服务器应用程序。

特点#

  • Eventloop利用Java的NIO来实现异步计算和I/O操作(TCP、UDP)。
  • 为进一步的业务逻辑处理消除了传统的I/O瓶颈。
  • 可以在可用内核上运行多个事件循环线程。
  • 最小的GC负载:数组和字节缓冲区被重复使用。
  • Eventloop可以安排/推迟某些任务,以便以后执行或后台执行。
  • Eventloop是单线程的,所以它没有并发的开销。
note

Eventloop是一个低级别的工具,在大多数使用情况下你不会直接使用。 然而,这是一个 极其重要的组成部分,它将使你了解ActiveJ的异步模型设置。

Eventloop 代表一个无限循环,每个 循环 执行所有的任务,这些任务由 Selector 提供,或存储在 特殊队列中。 这些任务中的每一个都应该是小的,其执行被称为 tick

Eventloop无限循环的唯一阻塞操作是 Selector.select()。 该操作选择一组键 ,其对应的通道已准备好进行I/O操作。 Eventloop异步处理选定的键,并在单线程中执行 排队的runnable。

Eventloop与不同类型的任务一起工作,这些任务被存储在不同的队列中。

任务通过以下方式添加描述
本地任务Eventloop#post Eventloop#postLater Eventloop#postNext从当前的Eventloop线程添加
并行任务Eventloop#execute Eventloop#submit从其他主题中添加
预定的任务Eventloop#schedule Eventloop#delay预定以后执行的
背景任务Eventloop#scheduleBackground Eventloop#delayBackground预定的,但如果只剩下 背景 任务,Eventloop将被停止。

如果Eventloop的非后台任务队列是空的, Selector ,没有选定的 keys,并且其他线程的并发操作量等于0,Eventloop将被停止。 为了防止Eventloop关闭,设置一个 keepAlive 标志。 当它被设置为 true,即使没有任务,Eventloop也会继续运行。

实例#

  • BasicExample - 一个简单的事件循环的例子,它打印出一个 "Hello World "的信息。
  • EventloopExample - 代表事件循环中的操作执行顺序。
note

要运行这些例子,你需要从GitHub上克隆ActiveJ。

git clone https://github.com/activej/activej

并将其作为一个Maven项目导入。 查看标签 v5.0-beta2。 在运行这些例子之前,先建立项目。 这些例子位于 activej/examples/core/eventloop

基本实例#

在这个例子中,我们创建了一个事件循环,向它发布了一个任务(即打印出 "Hello World "消息), ,然后启动事件循环。

public final class BasicExample {  public static void main(String[] args) {    Eventloop eventloop = Eventloop.create();
    eventloop.post(() -> System.out.println("Hello World"));
    eventloop.run();  }}

在GitHub上看到完整的例子

事件循环实例#

这个例子表示任务是如何在事件循环中被安排的。

public final class EventloopExample {  public static void main(String[] args) {    Eventloop eventloop = Eventloop.create().withCurrentThread();    long startTime = currentTimeMillis();
    // #2    eventloop.delay(3000L, () -> System.out.println("Eventloop.delay(3000) is finished, time: " + (currentTimeMillis() - startTime)));    eventloop.delay(1000L, () -> System.out.println("Eventloop.delay(1000) is finished, time: " + (currentTimeMillis() - startTime)));    eventloop.delay(100L, () -> System.out.println("Eventloop.delay(100) is finished, time: " + (currentTimeMillis() - startTime)));
    // #1    System.out.println("Before running eventloop, time: " + (currentTimeMillis() - startTime));
    eventloop.run();  }}

如果你运行这个例子,你会收到一个看起来像这样的输出。

在运行eventloop之前,时间:2Eventloop.delay(100)已经完成,时间:106Eventloop.delay(1000)已经完成,时间:1001Eventloop.delay(3000)已经完成,时间。3001

在GitHub上看到完整的例子