Tom*_*ito 4 java executorservice
我在这里的代码中看到很多
executorService.submit(() -> {
// do stuff
}).get();
Run Code Online (Sandbox Code Playgroud)
...我想知道为什么 executorService 是这样使用的,提交一些你会立即得到的东西?
调用立即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.
| 归档时间: |
|
| 查看次数: |
486 次 |
| 最近记录: |