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

分叉和联接功能jdk7线程数

汪驰
2023-03-14

我一直在研究JDK 7中的新特性,即Fork和Join。在Javadoc中,它指出,在ForkJoinWG中,不能仅在ForkJoinPool的上下文中执行fork。但是它没有提到fork()方法调用是否创建了一个新线程。

ForkJoinPool使用工作窃取算法来平衡线程之间的工作,但没有提到实际创建了多少线程。

我有一个任务,我应该以某种方式分解它,但我担心ForkJoinPool会创建太多线程,并且会因为管理这些线程的开销而降低执行性能。

有人能帮我吗?

共有1个答案

咸玄天
2023-03-14

Fork不一定会创建新的线程。在我的基准测试中,它只创建一个线程,每个可用的核心一个额外的线程。附加基准;从main()调用Factorizer.factorize(71236789143834319L),说。

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class Factorizer extends RecursiveTask<Long> {

static ForkJoinPool fjPool = new ForkJoinPool();
static final int sequentialThreshold = 10000;

private long number, low, high;

Factorizer(long number, long low, long high) {
    this.number = number; this.low = low; this.high = high;
}

private long factorize() {
    if ((number % 2) == 0) {
        return 2;
    }
    // ensures i is odd (we already know number is not even)
    long i = ((low % 2) == 0) ? low + 1: low;
    for (/**/; i < high; i+=2) {
        if ((number % i) == 0) {
            return i;
        }
    }
    return number;
}

@Override
protected Long compute() {

    // ugly debug statement counts active threads
    System.err.println(Thread.enumerate(
            new Thread[Thread.activeCount()*2]));

    if (high - low <= sequentialThreshold) {
        return factorize();
    } else {
        long mid = low + (high - low) / 2;
        Factorizer left = new Factorizer(number, low, mid);
        Factorizer right = new Factorizer(number, mid, high);
        left.fork();
        return Math.min(right.compute(), left.join());
    }
}

static long factorize(long num) {
    return fjPool.invoke(new Factorizer(num, 2, (long)Math.sqrt(num+1)));
}
}

注意-这只是一个测试。不要使用这段代码来认真考虑任何大的因素。

 类似资料:
  • 我不确定的是,在这种情况下,会创建多少个线程?我在一台2核心的机器上运行,所以每核心24个线程,最多48个线程? 当并行度因子设置为4.0时,可以并行运行的线程数将是8。那么,设置最小值和最大值(我的例子是24和48)的需要是什么?

  • 问题内容: 我以前在应用程序中使用过线程,并且对线程的概念非常了解,但是最近在我的操作系统讲座中,我遇到了fork()。这类似于线程。 我用谷歌搜索了它们之间的区别,我知道: Fork只是一个看起来与旧流程或父流程完全相似的新流程,但它仍然是具有不同流程ID并拥有自己内存的不同流程。 线程是轻量级进程,具有较少的开销 但是,我仍然有一些疑问。 什么时候应该更喜欢fork()而不是线程? 如果我想以

  • 问题内容: 我正在编写Node插件,尝试从C ++工作线程调用V8函数对象时遇到问题。 我的插件基本上是启动一个C std :: thread并使用WaitForSingleOject()进入一个等待循环,这是由另一个C 应用程序(一个X- Plane插件)向共享内存中写入数据触发的。我试图让我的Node插件在发出Windows共享事件信号时唤醒,然后调用我从node应用程序注册的JavaScri

  • 我正在用Java 8编写一个命令行应用程序。有一部分涉及一些计算,我相信使用多个线程并行运行可能会带来好处。然而,我在编写多线程应用程序方面没有太多经验,因此我希望您能引导我朝着正确的方向前进,我应该如何设计代码的并行部分。 为了简单起见,让我们假设所讨论的方法接收到一个相对较大的长数组,它应该返回一个只包含素数的集: 现在,我想重构方法,使其由四个线程并行执行,当所有线程都完成时,返回结果。在我

  • 问题内容: 可以使用fork()函数复制多线程进程。如果是这样,那么所有线程都将完全相同,如果不是,为什么不这样做。如果无法通过fork完成复制,是否还有其他功能可以帮助我? 问题答案: 进行分叉后,子进程中只有一个线程正在运行。这是POSIX标准要求。

  • 本文向大家介绍Shell脚本模拟多线程功能分享,包括了Shell脚本模拟多线程功能分享的使用技巧和注意事项,需要的朋友参考一下 说明:{} 这部分语句被放入后台作为一个子进程执行,这部分几乎是同时完成的,当fifo中10个空行读完后 while循环 继续等待 read 中读取fifo数据,当后台的10个子进程后,按次序排队往fifo输入空行,这样fifo中又有了数据,for语句继续执行。