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编程领域,多线程是一项核心且高级的技术,它允许多个任务同时执行,从而提升程序的效率和响应性。在这个"高级java 多线程 素数"的主题中,我们主要关注如何在多线程环境中实现素数检测。 素数是自然数中的一...
在子线程计算完成后,主线程可以通过调用UpdateUI方法更新显示的素数列表。 文件"Sieve"很可能包含了实现上述逻辑的源代码,包括CSieveThread类及其成员函数的定义,以及主线程如何启动和与子线程交互的代码。分析...
在实际操作中,我们需要设计一个算法来分配任务给不同的线程,比如将连续的质数区间划分给各个线程计算,然后将结果合并。同时,为了保证正确性和避免竞争条件,可能需要使用线程同步机制,如互斥量(mutex)或条件...
在编程领域,素数或质数是指大于1且仅能被1和其本身整除的自然数。在Java中实现打印素数的程序是一项基础但重要的任务,这有助于理解和掌握循环、条件判断以及数学逻辑在编程中的应用。下面将详细解释如何通过Java...
编写两个线程: 第一个线程计算2-1000000之间的质数及个数 第二个线程计算1000000-2000000之间的质数 及个数
尤其是对于计算密集型的任务,如素数查找,多线程的引入能够显著地缩短运算时间,提高资源利用率。Intel CnC(CnC,英特尔并行计算框架)和OpenMP是两种常见的并行计算框架,它们在处理多线程任务时各有特点。本文将...
Python 计算从1-N(N可以任何数)内的素数(并行计算、多线程优化计算)
Java多线程编程中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。这两种方式虽然都能实现多线程,但它们在实际应用中有着不同的特性和适用场景。 首先,我们来看看继承`Thread`类的方式。这种方式...
在C#编程中,多线程技术是一种提升程序性能的重要手段,它允许程序同时执行多个任务,从而提高程序的响应速度和效率。本项目聚焦于如何利用多线程来生成素数,并且提供了暂停、开始、退出和恢复的功能,这对于理解和...
虽然题目中没有明确指出使用这些特性,但在现代C#编程中,这可能是优化多线程计算的一个选择。 总的来说,"用C#编的质数线程"项目涉及了C#的线程编程、多核处理器的并行计算、质数的数学概念以及可能的并发控制策略...
在这个名为“wpf多线程显示100以内素数”的示例中,我们将探讨如何在WPF应用中利用多线程技术来计算并显示100以内的素数。 首先,素数是指大于1且只有1和其本身两个正因数的自然数。计算素数的方法有很多,如试除法...
【Java】求1-100范围内的素数递归方法代码例子。分享,感谢。
java代码-使用java解决输出1000以内最大的n个质数及其和。输出形式“质数1+质数2+...+质数n=的源代码 ——学习参考资料:仅用于个人学习使用!
【prime-calculator:一个用 Java 编写的 GUI 多线程素数计算器】 在计算机科学领域,素数是...这个项目的实现涉及了多种编程技术和数学知识,对于学习Java GUI编程和多线程计算的开发者来说,是一个有价值的参考案例。
#### 三、示例代码分析 - **1号进程创建2、3号两个进程** - 使用`fork()`函数创建子进程。 - 子进程执行不同的函数来进一步创建线程或进程。 - **2号进程创建两个线程Thread1、Thread2** - 通过`pthread_create()...
在本文中,我们将介绍如何使用多线程异步加载来解决单线程计算问题,并且提供了一个简单的示例代码。 多线程异步加载的原理是创建一个新的线程来执行计算任务,从而避免了单线程计算带来的卡顿问题。通过将计算任务...
这个压缩包文件“素数”可能包含了一个或多个Java源代码文件,用于解决Java第二版教材中的素数相关习题。以下将详细介绍Java编程中如何实现素数检测,并扩展到相关的数学和算法知识。 1. **素数判断算法**: - 最...
要求把所有素数输出到文本中,并记录计算过程时间、写入文本时间和执行程序总时间。 输出显示如下: ******************计算一亿以内的素数********************* 素数总数:XXXXX个 计算过程的时间:XXXXX秒 写入...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个独立的任务,从而提高程序的效率和响应性。本章重点讲解了多线程的相关概念和技术。 9.1 线程概念 线程被定义为程序中的单一顺序控制流。在多线程环境...
标题中的"vc源码,多线程示例"表明这是一个关于使用Visual C++(简称VC)进行多线程编程的源代码示例。在Windows环境下,VC是Microsoft开发的一个集成开发环境,它支持C++语言,可以用于创建各种类型的Windows应用...