Cod*_*Man 4 java multithreading future java-8 completable-future
我正在阅读java 8的行动,第11章(关于CompletableFutures),它让我思考我公司的代码库.
动作书中的java 8说如果你有像我下面写的代码,你一次只能使用4 CompletableFuture秒(如果你有4核计算机).这意味着如果你想异步执行10个操作,你将首先运行前4 CompletableFuture秒,然后是第2个4,然后是剩下的2个,因为默认ForkJoinPool.commonPool()只提供等于的线程数Runtime.getRuntime().availableProcessors().
在我公司的代码库中,有一个@Service名为AsyncHelpers的类,它们包含一个方法load(),该方法使用CompletableFutures在不同的块中异步加载有关产品的信息.我想知道他们一次只使用4个线程.
我公司的代码库中有几个这样的异步助手,例如,一个用于产品列表页面(PLP),另一个用于产品详细信息页面(PDP).产品详细信息页面是专门针对特定产品的页面,显示其详细特征,交叉销售产品,类似产品和更多内容.
有一个架构决定以块的形式加载pdp页面的细节.加载应该是异步发生的,当前代码使用CompletableFutures.我们来看看伪代码:
static PdpDto load(String productId) {
CompletableFuture<Details> photoFuture =
CompletableFuture.supplyAsync(() -> loadPhotoDetails(productId));
CompletableFuture<Details> characteristicsFuture =
CompletableFuture.supplyAsync(() -> loadCharacteristics(productId));
CompletableFuture<Details> variations =
CompletableFuture.supplyAsync(() -> loadVariations(productId));
// ... many more futures
try {
return new PdpDto( // construct Dto that will combine all Details objects into one
photoFuture.get(),
characteristicsFuture.get(),
variations.get(),
// .. many more future.get()s
);
} catch (ExecutionException|InterruptedException e) {
return new PdpDto(); // something went wrong, return an empty DTO
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,上面的代码不使用自定义执行程序.
这是否意味着如果该加载方法有10 CompletableFuture秒并且当前有2个人加载PDP页面,并且我们CompletableFuture总共加载了20 秒,那么所有这些20 CompletableFuture秒将不会同时执行,但只有4秒一次?
我的同事告诉我每个用户将获得4个线程,但我认为JavaDoc非常清楚地说明了这一点:
public static ForkJoinPool commonPool()返回公共池实例.这个游泳池是静态建造的; 其运行状态不受尝试shutdown()或shutdownNow()的影响.但是,在程序System.exit(int)中,此池和任何正在进行的处理将自动终止.在程序终止之前依赖异步任务处理完成的任何程序都应该在退出之前调用commonPool().awaitQuiescence.
这意味着我们网站的所有用户只有1个包含4个主题的池.
是的,但它比那更糟糕......
公共池的默认大小比处理器/核心数少 1(如果只有1个处理器,则为1),因此实际上每次处理3个,而不是4个.
但是你最大的性能影响是并行流(如果你使用它们),因为它们也使用公共池.Streams旨在用于超快速处理,因此您不希望它们与繁重的任务共享其资源.
如果您的任务设计为异步(即花费超过几毫秒),那么您应该创建一个池来运行它们.这样的池可以静态创建并由所有调用线程重用,这可以避免创建池的开销每次使用.您还应该通过对代码进行压力测试来调整池大小,以找到最佳大小以最大化吞吐量并最大限度地缩短响应时间.
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |