java - 如何将数学工作拆分为工作线程 Java

标签 java multithreading math synchronized

我正在开发一个计算数字幂的 Java 应用程序。我想利用我的四核计算机,因为此应用程序只使用了一个内核。我看过关于如何同步线程的不同教程,但我并没有真正理解。我的代码如下:

public class Bignum{

public static void main(String[] args){

    Random generator = new Random();   
    long start = System.nanoTime();   
    Random generator1 = new Random();

for (long i=0; i<9000;i++){

    int power = generator1.nextInt (17) + 2;
    int power1 = generator1.nextInt (25) + 2;
    int power2 = generator1.nextInt (72) + 2;

    BigInteger num = BigInteger.valueOf (generator.nextInt (7895) + 1);
    BigInteger num1 = BigInteger.valueOf (generator.nextInt (1250) + 1);
    BigInteger num2 = BigInteger.valueOf (generator.nextInt (9765) + 1);

    BigInteger add = num.pow(power);
    BigInteger add1 = num1.pow(power1);
    BigInteger add2 = num2.pow(power2);

    BigInteger sum = add.add(add1);

}

}
}

因此,例如,我如何让一个线程执行此操作:

    int power = generator1.nextInt (17) + 2;
    int power1 = generator1.nextInt (25) + 2;
    int power2 = generator1.nextInt (72) + 2;

另一个这样做:

    BigInteger num = BigInteger.valueOf (generator.nextInt (7895) + 1);
    BigInteger num1 = BigInteger.valueOf (generator.nextInt (1250) + 1);
    BigInteger num2 = BigInteger.valueOf (generator.nextInt (9765) + 1);

另一个:

    BigInteger add = num.pow(power);
    BigInteger add1 = num1.pow(power1);
    BigInteger add2 = num2.pow(power2);

最后一个这样做:

    BigInteger sum = add.add(add1);

我该怎么做?还有,我怎么还能重复9000次呢?感谢您的帮助。

最佳答案

在 Java 8 中,并行数学可以非常优雅。下面的代码利用了“+”运算是可加的这一事实,因此可以按任何顺序对值求和。

因此,下面的代码并行创建了一个数字序列,并在单个线程中对它们进行归约(求和)。

import java.math.BigInteger;
import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;

import static java.math.BigInteger.valueOf;
import static java.util.concurrent.ThreadLocalRandom.current;

public class Bignum {
    public static void main(String[] args) {
        Optional<BigInteger> sum = IntStream.range(0, 9000)
            .parallel()       <-- this enables parallel execution
            .mapToObj(value -> {
                ThreadLocalRandom generator = current();

                int power = generator.nextInt(17) + 2;
                int power1 = generator.nextInt(25) + 2;
                int power2 = generator.nextInt(72) + 2;

                BigInteger num = valueOf(generator.nextInt(7895) + 1);
                BigInteger num1 = valueOf(generator.nextInt(1250) + 1);
                BigInteger num2 = valueOf(generator.nextInt(9765) + 1);

                BigInteger add = num.pow(power);
                BigInteger add1 = num1.pow(power1);
                BigInteger add2 = num2.pow(power2);

                return add.add(add1).add(add2);
            })
            .reduce(BigInteger::add);

        System.out.println(sum.get());
    }
}

关于java - 如何将数学工作拆分为工作线程 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19988612/

相关文章:

javascript - 圆形辐射辐条

javascript - 在椭圆形中画一个长方形

c - 64 位数学运算,不会丢失任何数据或精度

java - 内联谓词的哈希码是什么?

java - 这种在线程之间传递对象的方式在 JMM 下安全吗?

java - 按给定四元数旋转单位 vector

c - 尝试了解 pthread 在 C 中的工作原理

c# - .ToList() 线程安全

java - HttpURLConnection 不允许我设置 "Via" header

java - 将字符串中的特殊字符替换为其他特殊字符