草庐IT

forkjoinpool

全部标签

java - ForkJoinTask 与 CompletableFuture

在Java8中有两种启动异步计算的方法-CompletableFuture和ForkJoinTask.它们看起来都非常相似-CompletableFuture的内部类甚至扩展ForkJoinTask.是否有理由使用一个而不是另一个?我能看到的一个关键区别是CompletableFuture.join方法简单地阻塞直到future完成(waitingGet只是使用ManagedBlocker旋转),而ForkJoinTask.join可以从队列中窃取工作以帮助您完成正在加入的任务。两者之间有什么好处吗? 最佳答案 它们是两个不同的东西

java - scala.concurrent.forkjoin.ForkJoinPool 与 java.util.concurrent.ForkJoinPool

为什么要为ScalaforkForkJoinPool?哪种实现方式和哪种情况更受欢迎? 最佳答案 scala库拥有自己的ForkJoinPool副本的明显原因是scala必须在1.7之前的JVM上运行,而ForkJoinPool仅在Java1.7中引入。此外,还针对内部(scala)使用进行了一些更改,例如:https://github.com/scala/scala/commit/76e9da2ca4c31daec2b04848c3c2dbad6ecd426e考虑到scala的版本可能不会给您带来任何优势(如果您针对java1.7

java - Java 8 并行流是否对序列使用相同的线程

假设我们有这样的东西:LongStream.range(0,10).parallel().filter(l->{System.out.format("filter:%s[%s]\n",l,Thread.currentThread().getName());returnl%2==0;}).map(l->{System.out.format("map:%s[%s]\n",l,Thread.currentThread().getName());returnl;});如果你运行这个程序输出会是这样的:filter:6[main]map:6[main]filter:5[main]filter:4

java - ForkJoinPool.commonPool() 是否等于没有池?

我已经确定,对于我的数据集,使用并行流确实比串行流更快。话虽如此,我想知道这个问题中讨论的ForkJoinPool使用情况:CustomthreadpoolinJava8parallelstream.给定,voidfoo(){barCollection.parallelStream()…dosomethingwiththestream}关于将使用哪个池,下面的1和2是否等效?1)ForkJoinPool.commonPool().submit(()->foo()).get();2)foo();如果答案是肯定的,那么为什么存在ForkJoinPol.commonPool()方法?

java - Scala 异步与 Java ForkJoinTask

前段时间我发现了ScalaAsyncProject.问题是:这个不能通过普通函数(没有宏扩展)实现的asyncblock有什么神奇之处?让我们看一下介绍中的第一个例子:importExecutionContext.Implicits.globalimportscala.async.Async.{async,await}valfuture=async{valf1=async{...;true}valf2=async{...;42}if(await(f1))await(f2)else0}在上面的示例中,我没有看到任何不能用纯Java编写的内容。此代码执行完全相同的操作:importjava

java - 是否可以在 Stream.parallel() 中设置线程的优先级?

如果我想在后台任务中并行运行一个流,是否可以以较低的优先级运行它?如果是这样的话? 最佳答案 是的,这是可能的。过程如下:创建一个ForkJoinWorkerThreadFactory以创建具有适当优先级的线程。使用上述线程工厂创建一个ForkJoinPool。实例化并行流。通过将流提交到ForkJoinPool来运行流像这样:publicclassMyThreadextendsForkJoinWorkerThread{publicMyThread(ForkJoinPoolpool,intpriority){super(pool);

java - 在并行流上调用顺序使所有先前的操作顺序

我有一组重要的数据,我想调用缓慢但干净的方法,而不是调用对第一个方法的结果有副作用的快速方法。我对中间结果不感兴趣,所以我不想收集它们。明显的解决方案是创建并行流,进行慢速调用,再次使流顺序化,然后进行快速调用。问题是,所有代码都在单线程中执行,没有实际的并行性。示例代码:@TestpublicvoidtestParallelStream()throwsExecutionException,InterruptedException{ForkJoinPoolforkJoinPool=newForkJoinPool(Runtime.getRuntime().availableProcess

java - 什么是 ForkJoinPool 异步模式

ForkJoinPool的异步模式是什么意思?Javadoc提到它使队列(是每线程队列吗?)FIFO而不是LIFO。这在实践中意味着什么? 最佳答案 ForkJoinPool中的每个工作线程都有自己的工作队列。Asyncmode关注每个工作人员执行从未从其工作队列中加入的fork任务的顺序。ForkJoinPool中的工作人员在异步模式下以FIFO(先进先出)顺序处理此类任务。默认情况下,ForkJoinPool以LIFO(后进先出)顺序处理此类任务。需要强调的是,异步模式设置仅涉及从未加入的fork任务。当使用ForkJoinPo

java - ForkJoinPool 中的 Execute 、 Submit 和 Invoke() 之间的区别

我有以下运行和编译的类(您可以尝试一下)。唯一让我有点困惑的是,在main的最后,它与fj.invoke(task)一起工作正常,但它与fj.execute(task)和fj.submit(task)不兼容。我没有得到后者的任何输出。从API来看,它也应该与其他方法一起工作,它们也执行任务。即使它们返回或不返回值,它们仍然应该执行任务。我在这里缺少什么?importjava.util.concurrent.RecursiveAction;importjava.util.concurrent.ForkJoinPool;publicclassRecursiveTaskActionThing

java - 在 Java8 parallelStream() 中使用 I/O + ManagedBlocker 有什么问题吗?

Java8中默认的“paralellStream()”使用公共(public)的ForkJoinPool,如果在提交任务时公共(public)的Pool线程耗尽,这可能是一个延迟问题。然而,在许多情况下,有足够的CPU能力可用并且任务足够短,因此这不是问题。如果我们确实有一些长时间运行的任务,这当然需要仔细考虑,但对于这个问题,我们假设这不是问题所在。但是,即使有足够的CPU能力可用,用实际上不执行任何CPU绑定(bind)工作的I/O任务填充ForkJoinPool也是一种引入瓶颈的方法。Iunderstoodthat.然而,这正是我们拥有ManagedBlocker的目的。因此,如