gpt4 book ai didi

java - ForkJoinPool 和 Future.Get

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:32 25 4
gpt4 key购买 nike

假设我有一个并行度为 n 的 ForkJoinPool 设置,并且我这样调用并行计算:

 workpool.submit(
() -> {
objects.values().parallelStream().forEach(obj -> {
obj.foo();
});
});

我这样做是为了确保在那里生成的线程是在工作池中创建的(我有不同的系统组件需要隔离)。现在假设调用它的线程也在这个工作池中执行,我这样做:

 Future<?> wait =  workpool.submit(
() -> {
objects.values().parallelStream().forEach(obj -> {
obj.foo();
});
});
wait.get()

1) 我是否阻塞了 ForkJoinPool 中的线程?如果我让 n 个线程都阻塞在 futures 上,同时尝试在工作池中安排任务,这会导致死锁吗?我不清楚ForkJoinPool中的“最大并行度”是指(如果有n个非阻塞任务),总是有n个线程在执行,还是有固定数量的线程,不管是否有封锁。如果我改用 wait.join() 代替 wait.join 怎么办(我不需要检查异常,因为这段代码中抛出的任何异常都会产生运行时异常。如果我理解正确, join() 将允许线程在等待时执行排队的任务)

2) 如果我通过执行 () -> {}

创建可运行的“包装器”类,我是否仍能从并行流的轻量级 forkjoin 任务中获益?

3) 使用它是否有任何缺点/优点(假设 .join() 确实实现了我认为的工作窃取行为):

        CompletableFuture.supplyAsync(this::mylambdafunction, workpool)  
.thenAccept(this::mynextfunction);

最佳答案

对第 1 点的回应:如果不查看实际的方法实现,就很难知道您的代码是否会阻塞。处理阻塞代码的一种方法是增加 forkjoin 线程池中的线程数。通常,对于计算密集型任务,forkjoin 线程中的线程数为 n+1,其中 n = 处理器数。或者,如果您有 I/O 阻塞,您可以使用 ManagedBlocker。

对第 2 点的回应:

对第 3 点的回应:您的 completableFuture 代码的明显优势是 thenAccept 是非阻塞的。因此,控制将立即通过您的 CompletableFuture block 进入下一条语句而无需等待,而在您使用 ForkJoin 池编写的早期代码中,wait.get() 将阻塞直到您获得答案并且直到那时才会继续。

关于java - ForkJoinPool 和 Future.Get,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43266342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com