原文链接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);
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