public abstract class AbstractPrimeFinder {
public boolean isPrime(final int number) {
if (number <= 1)
return false;
for (int i = 2; i <= Math.sqrt(number); i++)
if (number % i == 0)
return false;
return true;
}
public int countPrimesInRange(final int lower, final int upper) {
int total = 0;
for (int i = lower; i <= upper; i++)
if (isPrime(i))
total++;
return total;
}
public void timeAndCompute(final int number) {
final long start = System.nanoTime();
final long numberOfPrimes = countPrimes(number);
final long end = System.nanoTime();
System.out.printf("Number of primes under %d is %d\n", number,
numberOfPrimes);
System.out.println("Time (seconds) taken is " + (end - start) / 1.0e9);
}
public abstract int countPrimes(final int number);
}
public class SequentialPrimeFinder extends AbstractPrimeFinder {
public int countPrimes(final int number) {
return countPrimesInRange(1, number);
}
public static void main(final String[] args) {
new SequentialPrimeFinder().timeAndCompute(10000000);
}
}
在我的ubutun下双核cpu的输出
单线程下的执行结果
Number of primes under 10000000 is 664579
Time (seconds) taken is 7.518444261
多线程下
package com.mime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class ConcurrentPrimeFinder extends AbstractPrimeFinder {
private final int poolSize;
private final int numberOfParts;
public ConcurrentPrimeFinder(final int thePoolSize,
final int theNumberOfParts) {
poolSize = thePoolSize;
numberOfParts = theNumberOfParts;
}
public int countPrimes(final int number) {
int count = 0;
try {
final List<Callable<Integer>> partitions = new ArrayList<Callable<Integer>>();
final int chunksPerPartition = number / numberOfParts;
for (int i = 0; i < numberOfParts; i++) {
final int lower = (i * chunksPerPartition) + 1;
final int upper = (i == numberOfParts - 1) ? number : lower
+ chunksPerPartition - 1;
partitions.add(new Callable<Integer>() {
public Integer call() {
return countPrimesInRange(lower, upper);
}
});
}
final ExecutorService executorPool = Executors
.newFixedThreadPool(poolSize);
final List<Future<Integer>> resultFromParts = executorPool
.invokeAll(partitions, 10000, TimeUnit.SECONDS);
executorPool.shutdown();
for (final Future<Integer> result : resultFromParts)
count += result.get();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
return count;
}
public static void main(final String[] args) {
new ConcurrentPrimeFinder(4,100).timeAndCompute(10000000);
}
}
输出
Number of primes under 10000000 is 664579
Time (seconds) taken is 3.825282456
可以根据cpu个数和调整分区树来调优这个线程数来达到最有效果。
分享到:
相关推荐
高级java 多线程 素数 10线程。 简单易懂。
编写两个线程: 第一个线程计算2-1000000之间的质数及个数 第二个线程计算1000000-2000000之间的质数 及个数
Python 计算从1-N(N可以任何数)内的素数(并行计算、多线程优化计算)
简单java示例 需要的朋友可以下载参考 有注释
计算10,000,000内素数个数,Pthread编写线程数可调整。
【Java】求1-100范围内的素数递归方法代码例子。分享,感谢。
java代码-使用java解决输出1000以内最大的n个质数及其和。输出形式“质数1+质数2+...+质数n=的源代码 ——学习参考资料:仅用于个人学习使用!
要求把所有素数输出到文本中,并记录计算过程时间、写入文本时间和执行程序总时间。 输出显示如下: ******************计算一亿以内的素数********************* 素数总数:XXXXX个 计算过程的时间:XXXXX秒 写入...
这个例子来源于mfc windows程序设计多线程章节的例子
intel cnc 的例子,查找素数 例子可以明显的看出cnc和openmp的区别 可以配合英特尔的ppt一起使用
2011 Intel 线程挑战赛入门级之二 求连续质数和的完全幂
c#多线程产生素数,可以暂停,开始,退出,恢复,适合初学者使用
ThreadImRunnable.java 继承Runnable接口实现多线程 mulThread.java 创建多个线程对象的类 demoJoin.java 演示使用join()以确保主线程最后结束 clicker.java 一个计数用的线程类 demoPri.java 调用上面这个类...
2号进程创建两个线程Thread1,Thread2 Thread1:求(1~n)之间的素数 Thread2:生成Fibonacci序列 3号进程创建4,5号两个进程 4号进程执行系统命令,ls,ps,cp等 5号进程执行一个用户编写的可执行文件 每个进程...
素数Java程序,用于Java第二版教材上的习题求Java素数
Java 求指定范围内素数的个数,接受用户从键盘输入所求范围,计算出该范围内素数的个数。
关于Java中素数的概念,及Java代码的写法,写了几种方法
计算器 Java制作的GUI多线程计算数计算器
编写基于多线程的素数(是除了自身和1以外,没有其它素数因子的自然数)判定程序。待判定的整数经过键盘录入后存放在一个列表中,创建10个线程从列表中取出整数进行判定,判定的结果存入到另一个列表中,用户可以通过...
一个简单而易懂的判断一个数是否为素数的java代码