问题标签 [forkjoinpool]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1307 浏览

java - Fork-Join 线程池中长时间运行的任务会阻塞所有线程吗?

我一直在学习 Java 8 的并行流,这篇文章出现在 Google 搜索的第一页。我无法从文章中理解这一特定行

...所有并行流都使用公共 fork-join 线程池,如果您提交一个长时间运行的任务,您实际上会阻塞池中的所有线程。

我无法弄清楚长时间运行的任务如何阻塞池中的所有其他线程。

0 投票
1 回答
992 浏览

java - 使用 parallelStream 时抛出 InterruptedException - Java

我有一个嵌套for循环的方法,如下所示:

这很好用,但应用程序对性能至关重要,所以我修改了使用方法parallelStream(),如下所示:

这工作得很好,直到我想InterruptedException在“getLeaves()”方法中引入一个。现在该parallelStream版本将无法编译,因为它说我有一个未报告InterruptedException的必须被捕获或声明为被抛出。我认为这是因为parallelStream在多个线程上运行。我的 IDE 建议的 try/catch 块的组合无法解决此问题。

在中断并行流执行中发布的第二个解决方案 表明我可以使用解决问题,ForkJoinPool但我一直无法弄清楚如何修改我的方法以使用这种方法。

0 投票
1 回答
1924 浏览

java - 为什么 ForkJoinPool.commonPool().execute(runnable) 需要更多时间来运行线程

我正在使用ForkJoinPool.commonPool().execute(runnable)一种方便的方式在我的应用程序的许多地方生成线程。但是在特定的调用中,调用线程中的可运行代码需要更多时间(超过 10 秒)。这可能是什么原因?如何避免这种情况?

编辑:根据@ben 的回答,避免线程池中长时间运行的进程似乎是解决方案。手动创建新线程解决了我的问题,而不是使用常见的 ForkJoinPool。

0 投票
1 回答
279 浏览

java - 自定义 ForkJoinPool 中的嵌套 ArrayList.ParallelStream() 使用线程不均匀

我想使用我的自定义 ForkJoinPool 与 ArrayList.parallelStream() 具有更多的并行性(默认情况下它使用公共池)。

我这样做:

当我观察 VisualVM 的工作原理时,我看到: VisualVM with parallelism 10

在某些时候,一些线程被停放,而其他线程完成其余的工作。当我查看转储时,我看到什么都不做的线程处于停放状态。

实验表明,如果您创建一个带有并行参数的 ForkJoinPool 是 2 的幂,那么一切正常......

具有并行性 8 的 VisualVM

它可以是任何小于 64 的 2 的幂(我不知道为什么,但它不超过 ForkJoinPool 的 34 个线程),但如果它不是 2 的幂,我们会得到奇怪的行为。

为什么会发生?如何使用它?

0 投票
2 回答
2140 浏览

java - Tomcat升级后并行流不设置Thread.contextClassLoader

在 tomcat 从 8.5.6 升级到 8.5.28 并行流后停止为线程提供 contextClassLoader:

因为它Warmer::run无法在其中加载类。

你知道 Tomcat 为新线程的 contextClassLoaders 提供了什么吗?

ParallelStream 在最新的 Tomcat 中使用 ForkJoinPool。

0 投票
0 回答
185 浏览

java - java fork join 框架:为什么线程不互相窃取工作?

下面是我的 Fork-join 示例代码。它应该计算正确执行的数组中的最大数量。但是在代码中我看不到线程互相窃取工作。大部分时间窃取计数为 0。出了什么问题?

下面是递归任务的实现

输出 :

0 投票
1 回答
438 浏览

java - 为什么在 ForkJoinPool.WorkQueue 的推送中需要 Unsafe.putOrderedObject 而不是使用 array[index]

U.putOrderedObject 和 U.putOrderedInt 设置 WorkQueue 的数组和顶部。那么为什么不直接使用 array[i]=task 和 top=s+1。我正在阅读 ForkJoinPool 的源代码并遇到了这个问题。

来自 oracle jdk 1.8(1.8.0_131) 的源代码。

0 投票
1 回答
260 浏览

scala - 在 Scala 中使用 ForkJoinPool

在代码中:

此代码打印:此任务异步运行

但是如果我删除 Thread.sleep(10000),程序不会打印。然后我了解到这是因为 sleep 会阻止 ForkJoinPool 中的守护线程在调用 Runnable 对象上的 run 方法之前被终止。

所以,几个问题:

  1. 这是否意味着由 ForkJoinPool 启动的线程都是守护线程?为什么会这样?
  2. 睡眠在这里有什么帮助?
0 投票
0 回答
613 浏览

java - 使用 testng 测试 forkjoinpool

我想编写一些测试来检查我使用 ForkJoinPool 对休息服务的异步调用。我有以下代码:

在我的测试中,我有以下代码:

问题是当我执行测试时它会永远运行。我试图添加 Thread.sleep() 只是为了看看它是否会改变,但它不会。当我尝试调试测试时,它会通过所有准备代码调用测试方法,当它到达时它firstList= someJoinTask1.get();someMethod();挂起。

这是我的线程转储(我不知道是否需要):

我正在使用 TestNg 和 Mockito

0 投票
1 回答
744 浏览

java - ForkJoinPool 的工作窃取机制未按预期工作

我有以下测试代码

它基本上将 3 个任务提交给并行度为 2 的 ForkJoinPool,任务 2 和 3 长时间运行,任务 1 等待任务 2。

标记 2 个线程 t1 和 t2,其中 t1 执行 task1,t2 执行 task2。

在我的理解中,工作窃取魔法发生在 join() 调用中,调用线程将从自己的工作队列或其他工作线程的工作队列中执行任务。因此,我期望 t1 执行 task1,看到 join() 调用然后窃取 task3 并执行它以完成。

然而,在实践中,t1 并没有对 join() 调用做任何特别的事情。Task3 仅在 task1 和 task2 都完成后执行。为什么会这样?