Skip to content
gqlxj1987's Blog
Go back

ForkJoinPoll

Edit page

原文链接1

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

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

判断一个数是否为质数

// 要计算的质数
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


Edit page
Share this post on:

Previous Post
Why Fuck Templating Yaml
Next Post
Servicecomb Pack