gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:05:49 26 4
gpt4 key购买 nike

我正在开发一个计算数字幂的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com