当前位置: 首页 > 知识库问答 >
问题:

如何配置单线程ForkJoinPool?

段干子晋
2023-03-14

是否可以配置ForkJoinpool使用1个执行线程?

我正在执行在ForkJoinPool中调用Random的代码。每次它运行时,我都会遇到不同的运行时行为,这使得研究回归变得很困难。

我希望代码库提供“调试”和“发布”模式。“调试”模式将使用固定种子配置Random,并使用单个执行线程配置ForkJoinPool。“释放”模式将使用系统提供的Random种子,并使用默认数量的ForkJoinPool线程。

我尝试配置ForkJoinpool的并行性为1,但它使用2个线程(main和第二个工作线程)。有什么想法吗?

共有2个答案

司马飞鸿
2023-03-14

主线程始终是应用程序将创建的第一个线程。因此,当您创建具有1并行性ForkJoinpool时,您正在创建另一个线程。实际上,应用程序中现在将有两个线程(因为您创建了线程的)。

如果您只需要一个主线程,您可以按顺序执行代码(而不是并行执行)。

侯令雪
2023-03-14

所以,结果证明我错了。

当您配置将并行性设置为1的ForkJoinpool时,只有一个线程执行任务。主线程在ForkJoin.get()上被阻塞。它实际上不执行任何任务。

也就是说,事实证明,提供确定性行为确实很棘手。以下是我必须纠正的一些问题:

  • ForkJoinpool如果工作线程空闲足够长,则使用不同的工作线程(具有不同的名称)执行任务。例如,如果主线程在调试断点上挂起,则工作线程将变为空闲并关闭。当我要恢复执行时,ForkJoinThread将旋转一个新的工作线程,其名称不同。为了解决这个问题,我必须提供一个自定义ForkJoinWorkerThreadFactory实现,如果ForkJoinpool已经有一个活动的工作人员(这防止池创建多个工作人员),则返回null。我还必须确保我的代码返回相同的Random实例,即使一个工作线程关闭并再次返回。
  • 具有非确定性迭代顺序(如HashMapHashSet)的集合导致元素在每次运行时以不同的顺序抓取随机数。我通过使用LinkedHashMapLinkedHashSet纠正了这一点。
  • 具有非确定性hashCode()实现的对象,例如Enum.hashCode()。我忘记了这导致了什么问题,但我通过自己计算hashCode()来纠正它,而不是依赖于内置的方法。

以下是ForkJoinWorkerThreadFactory的示例实现:

class MyForkJoinWorkerThread extends ForkJoinWorkerThread
{
    MyForkJoinWorkerThread(ForkJoinPool pool)
    {
        super(pool);
        // Change thread name after ForkJoinPool.registerWorker() does the same
        setName("DETERMINISTIC_WORKER");
    }
}

ForkJoinWorkerThreadFactory factory = new ForkJoinWorkerThreadFactory()
{
    private WeakReference<Thread> currentWorker = new WeakReference<>(null);

    @Override
    public synchronized ForkJoinWorkerThread newThread(ForkJoinPool pool)
    {
        // If the pool already has a live thread, wait for it to shut down.
        Thread thread = currentWorker.get();
        if (thread != null && thread.isAlive())
        {
            try
            {
                thread.join();
            }
            catch (InterruptedException e)
            {
                log.error("", e);
            }
        }
        ForkJoinWorkerThread result = new MyForkJoinWorkerThread(pool);
        currentWorker = new WeakReference<>(result);
        return result;
    }
};
 类似资料:
  • API1.7和SLF4J-实现简单。我只是找不到如何用这种组合配置日志级别。 有人能帮忙吗?

  • 我想同时向一个webservice发送webservice调用。最多应有20个并行请求等待webservice响应。任何其他请求都应该等待它们完成。 如果一个用户向我发送一个请求,这通常会导致向目标服务器发送5个并行请求。因此,我一次最多可以服务20/5=4个用户。其他人将不得不等待,这很好。或者被高负荷拒绝。 问题:我应该使用哪个线程池,以及如何配置它? 我读了上面的内容如下:主池可以向网络服务

  • 我想知道我的 CORBA 服务器可以同时处理多少个客户端请求: < li >服务器是否为每个新的客户端请求创建一个新的线程? < li >有线程池吗? < li >默认线程池大小是多少? < li >如果达到最大尺寸会怎么样?新线程在队列中等待吗? < li >池中非活动线程(已用于客户端的线程)的空闲时间是多少? < li >我们能否配置这些参数(池大小 我做了很多研究,但我没有找到太阳/甲骨文

  • 问题内容: 我对Javascript的单线程性质有疑问。 此代码的结果是。如您所见,这之后让我感到奇怪的是,在单线程环境中是否应该不应该这样做?如果没有,那么JS怎么知道第二个应该在第一个之前完成?难道不应该有两个线程可以同时工作以完成两个s以便进行通知吗? 问题答案: JavaScript(在浏览器中) 不能 同时运行2。 最多 一个 的的回调可以同时执行-因为有 一个 JavaScript执行

  • 下面是如何通过配置单元JDBC运行查询的 从纱线URL,找不到应用程序ID。

  • 我注意到一些web框架(如Play Framework)允许您配置多个不同大小的线程池(线程池中的线程数)。假设我们在单核的单机中运行这个游戏。拥有多个线程池不会有很大的开销吗?