DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

ForkJoinPoll

原文链接1

Fork/Join池没有一个最大线程数,只有一个期望并发数,指我们希望同时又多少活跃的线程,通常默认值即运行时计算机处理器的数量-1,可以通过如下方式来显示的调整。
-Djava.util.concurrent.ForkJoinPool.common.parallelism=N
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "20");

大的任务分割成互不依赖的子任务,减少线程竞争,将任务放在不同的队列。
每个线程维护一个双端队列,线程自己队列任务完成之后,可以从其他线程里面窃取任务,被窃取线程从头部获取任务,窃取线程从队列尾部获取任务。

判断一个数是否为质数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 要计算的质数
primeNumber = new BigInteger(sPrime);
// 对质数进行求平方根
sqrt = Utils.sqrt(primeNumber);
// 线程数 ForkJoinPoll开启worker线程数
numberOfThread = new BigInteger(sNumberOfThread);
// 给每个线程分配的块
lengthForThread = TestPrime.sqrt.divide(numberOfThread);
//
Set<BigInteger> collect = Stream
.iterate(Utils.two, n -> n.add(TestPrime.lengthForThread))
.limit(TestPrime.numberOfThread.longValue())
.parallel()
.filter(i -> Utils.primeProcessPart(i))
.collect(Collectors.toSet());
//
public static Boolean primeProcessPart(BigInteger from) {
boolean isPrime = true;
BigInteger to = from.add(TestPrime.lengthForThread);
for (BigInteger i = from; i.compareTo(to) <= 0; i = i
.add(BigInteger.ONE)) {
if (TestPrime.primeNumber.mod(i).equals(BigInteger.ZERO)) {
isPrime = false;
}
}
return isPrime;
}

原文链接2