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()将会阻塞,直到您获得答案为止,直到此时才会继续。