Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Vert.x为http服务器创建新的事件循环?_Java_Multithreading_Vert.x_Event Loop - Fatal编程技术网

Java 为什么Vert.x为http服务器创建新的事件循环?

Java 为什么Vert.x为http服务器创建新的事件循环?,java,multithreading,vert.x,event-loop,Java,Multithreading,Vert.x,Event Loop,我有一个非常简单的Vert.x应用程序,它公开了一个ping端点: LauncherVerticle.java 现在我在VisualVM中看到了两个新线程,一个是我或多或少可以理解的接受线程,另一个是eventloop线程: 为什么要创建第三个eventloop线程?根据: 要使用的默认事件循环线程数=2*线程数 机器上的磁芯 看起来,您有不止一个内核。关于vert.x体系结构的文档不多,但有一个有趣的阅读 顺便说一句,我有四个核心机器,我在应用程序启动时看到相同数量的线程。我注意到,随着生成

我有一个非常简单的Vert.x应用程序,它公开了一个ping端点:

LauncherVerticle.java 现在我在VisualVM中看到了两个新线程,一个是我或多或少可以理解的接受线程,另一个是eventloop线程:

为什么要创建第三个eventloop线程?

根据:

要使用的默认事件循环线程数=2*线程数 机器上的磁芯


看起来,您有不止一个内核。

关于vert.x体系结构的文档不多,但有一个有趣的阅读

顺便说一句,我有四个核心机器,我在应用程序启动时看到相同数量的线程。我注意到,随着生成的负载增加,eventloop线程的数量增加,而其他线程在每个vert.x进程中保持单个

总之,

  • vert.x-acceptor-thread-0
    • 创建HttpServer时始终存在
  • vert.x-eventloop-thread-0
  • vert.x-eventloop-thread-1
    • Vert.x应用程序从两个eventloop线程开始,并根据需要动态添加更多线程,直到核心数翻倍,即根据文档增加2*个核心
  • 垂直x阻塞线程检测器
    • 始终存在检测eventloop上阻塞例程超过2000毫秒的漏洞

  • 为什么不呢?可以通过在
    VertxOptions
    中指定事件循环池大小来限制eventloop线程的数量。默认情况下,机器上的磁芯数为2 x您在这方面是正确的。但是我的机器有4个内核。Vert.x应该创建8个事件循环线程。为什么它决定创建第三个线程呢?线程是惰性创建的。通常,当调用
    runOnContext
    时(例如,当应该部署新的垂直体时)。您可以调试io.vertx.core.impl.VertxThreadFactory#newThread以了解创建每个线程的原因和时间。
    public class LauncherVerticle extends AbstractVerticle {
        @Override
        public void start(Future<Void> future) throws Exception {
            DeploymentOptions options = new DeploymentOptions();
            options.setConfig(config());
            options.setInstances(1);
    
            String verticleName = Example1HttpServerVerticle.class.getName();
            vertx.deployVerticle(verticleName, options, ar -> {
                if (ar.succeeded()) {
                    future.complete();
                } else {
                    future.fail(ar.cause());
                }
            });
        }
    }
    
    public class PingVerticle extends AbstractVerticle {
        @Override
        public void start(Future<Void> future) throws Exception {
            Router router = Router.router(vertx);
    
            router.get("/ping").handler(context -> {
                String payload = new JsonObject().put("hey", "ho").encode();
                context.response().putHeader("content-type", "application/json").end(payload);
            });
        }
    }
    
        String host = "0.0.0.0";
        int port = 7777;
        vertx.createHttpServer().requestHandler(router::accept).listen(port, host, ar -> {
            if (ar.succeeded()) {
                future.complete();
            } else {
                future.fail(ar.cause());
    
            }
        });