vert.x如何是单线程的?

时间:2014-05-29 10:28:52

标签: java multithreading vert.x single-threaded singlethreadmodel

根据我的理解,每个vert.x实例都将被分配一个事件循环。事件循环处理该特定实例的所有请求和其他任务。我想,事件循环是一个主题。当部署了多个vert.x实例时,每个实例都有自己的事件循环吗?这意味着存在多个线程(多线程)。这就是我的理解。这种单线程概念让我非常头疼。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:10)

Vert.x不像node.js那样是单线程的。 在vert.x中,您必须区分Verticles和WorkerVerticles。一个Vert.x实例将创建多个事件循环(它们是线程),通常每个CPU核心一个。 Verticle将被分配给一个事件循环,并且将始终由同一个线程执行,但前提是有工作要做。 WorkerVerticles将被分配给来自工作池的线程,并且可以由不同的线程执行。 使Vert.x编程变得有趣的事实是你可以“假装”它是单线程的。您不必关心并发性,因为您无法在Verticle之间共享变量。每个Verticle都在自己的类加载器中运行,您只能通过事件总线共享数据。 (还有一个共享地图,但在这种情况下会分散注意力。)

答案 1 :(得分:8)

你现在可能已经弄明白了,但我正在为可能会遇到这个问题的其他人发布答案。

vert.x实例将创建多个线程。在 vert.x实例内部,您可以运行多个 Verticle (更准确地说是Verticle实例)。 它是 Verticle实例,它分配了事件循环,但事件循环并非专门分配给该Verticle。

当您运行更多线程数的Verticle时,可能会发生重叠。在这种情况下,一些Verticle将被分配给与其他Verticle相同的事件循环。该事件循环将处理来自所有已分配的Verticle的事件。

但是,一旦Verticle实例启动并分配给事件循环/线程,它就会在它上面运行,直到Verticle终止。