ForkJoinPool和的Future.get

ForkJoinPool和的Future.get

问题描述:

假设我有一个ForkJoinPool设置与并行度n的程度,那我叫并行计算是这样的:ForkJoinPool和的Future.get

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

我这样做是为了确保线程催生有创建在工作区内(我有需要隔离的系统的不同组件)。现在假设在这个被称为线程,也是本workpool内部执行,而我呢:

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

1)我是不是堵在ForkJoinPool一个线程?如果我有n个线程全部阻塞未来,同时试图在工作区中安排任务,这是否会导致死锁?我不清楚ForkJoinPool中的“最大并行度”是否意味着(如果有n个非阻塞的任务),总会有n个线程执行,或者是否有固定数量的线程,无论是否有阻塞。如果我使用wait.join()而不是wait.join(我不需要检查异常,因为在此代码中引发的任何异常都已经生成了runtimeexception。如果我理解正确,join()将允许线程在等待时执行排队的任务)

2)我仍然这样做()获得重量轻的优点forkjoin并行流的任务,如果我创建一个可运行的“包装”类 - > {}

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

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

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

响应指向2:为3点是

响应:明显的上攻您completableFuture代码是,thenAccept是非阻塞。因此,控制权会立即通过您的CompletableFuture块到达下一条语句而无需等待,而在您使用ForkJoin池写入的早期代码中,wait.get()将会阻塞,直到您获得答案为止,直到此时才会继续。