将 ExecutorService 与立即 get() 一起使用有什么好处?

Tom*_*ito 4 java executorservice

我在这里的代码中看到很多

executorService.submit(() -> {
    // do stuff
}).get();
Run Code Online (Sandbox Code Playgroud)

...我想知道为什么 executorService 是这样使用的,提交一些你会立即得到的东西?

Boh*_*ian 6

调用立即get()强制ExecutorService在执行程序服务的线程池而不是本地线程中处理“做事”,例如,如果分配给它的最大线程数很小,则可能会阻塞处理,尽管有大量线程正在运行来处理要求。

考虑一个只有 1 个线程的执行程序服务的明显示例:

ExecutorService executorService = Executors.newSingleThreadExecutor();
Run Code Online (Sandbox Code Playgroud)

以及从 a 调用的示例代码HttpRequestHandler

通过使用get()“do stuff”的立即处理将被序列化,这可能是可取的或必需的,尽管有许多同时的请求在各自的线程中被处理。

如果没有 的包装器executorService.submit(...).get(),“do stuff”的处理将在请求处理程序的线程中并行完成,这可能没问题,但如果“do stuff”特别昂贵或在并行性不受限制的情况下以某种方式受到限制,则可能会导致问题。

并行性可以被限制/限制而不是消除,如下所示:

ExecutorService executorService = Executors.newFixedThreadPool(3);
Run Code Online (Sandbox Code Playgroud)

将处理限制为(例如)最多 3 个并发处理“do stuff”,尽管同时处理大量请求。


通过选择Thread“do stuff”运行的位置,还可以产生其他更微妙的效果。考虑:

ExecutorService executorService = Executors.newSingleThreadExecutor(myThreadFactory);
Run Code Online (Sandbox Code Playgroud)

将使“do stuff”在自定义类型的线程中运行,而不是在为HttpRequestHandler.