`

java 下计算质数的多线程跟单线程执行代码分析

    博客分类:
  • java
 
阅读更多

 

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 多线程 代码

    在Java编程领域,多线程是一项核心且高级的技术,它允许多个任务同时执行,从而提升程序的效率和响应性。在这个"高级java 多线程 素数"的主题中,我们主要关注如何在多线程环境中实现素数检测。 素数是自然数中的一...

    MFC,多线程例子,计算素数

    在子线程计算完成后,主线程可以通过调用UpdateUI方法更新显示的素数列表。 文件"Sieve"很可能包含了实现上述逻辑的源代码,包括CSieveThread类及其成员函数的定义,以及主线程如何启动和与子线程交互的代码。分析...

    多线程求连续质数和的完全幂

    在实际操作中,我们需要设计一个算法来分配任务给不同的线程,比如将连续的质数区间划分给各个线程计算,然后将结果合并。同时,为了保证正确性和避免竞争条件,可能需要使用线程同步机制,如互斥量(mutex)或条件...

    java实现打印素数/质数程序

    在编程领域,素数或质数是指大于1且仅能被1和其本身整除的自然数。在Java中实现打印素数的程序是一项基础但重要的任务,这有助于理解和掌握循环、条件判断以及数学逻辑在编程中的应用。下面将详细解释如何通过Java...

    java多线程使用

    编写两个线程:  第一个线程计算2-1000000之间的质数及个数  第二个线程计算1000000-2000000之间的质数 及个数

    多线程查找素数

    尤其是对于计算密集型的任务,如素数查找,多线程的引入能够显著地缩短运算时间,提高资源利用率。Intel CnC(CnC,英特尔并行计算框架)和OpenMP是两种常见的并行计算框架,它们在处理多线程任务时各有特点。本文将...

    Python 计算从1-N(N可以任何数)内的素数(并行计算、多线程优化计算)

    Python 计算从1-N(N可以任何数)内的素数(并行计算、多线程优化计算)

    Java多线程-对比创建多线程的两种方式

    Java多线程编程中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。这两种方式虽然都能实现多线程,但它们在实际应用中有着不同的特性和适用场景。 首先,我们来看看继承`Thread`类的方式。这种方式...

    c#多线程产生素数,可以暂停,开始,退出,恢复

    在C#编程中,多线程技术是一种提升程序性能的重要手段,它允许程序同时执行多个任务,从而提高程序的响应速度和效率。本项目聚焦于如何利用多线程来生成素数,并且提供了暂停、开始、退出和恢复的功能,这对于理解和...

    用C#编的质数线程

    虽然题目中没有明确指出使用这些特性,但在现代C#编程中,这可能是优化多线程计算的一个选择。 总的来说,"用C#编的质数线程"项目涉及了C#的线程编程、多核处理器的并行计算、质数的数学概念以及可能的并发控制策略...

    wpf多线程显示100以内素数

    在这个名为“wpf多线程显示100以内素数”的示例中,我们将探讨如何在WPF应用中利用多线程技术来计算并显示100以内的素数。 首先,素数是指大于1且只有1和其本身两个正因数的自然数。计算素数的方法有很多,如试除法...

    【Java】求1-100范围内的素数递归方法

    【Java】求1-100范围内的素数递归方法代码例子。分享,感谢。

    java代码-使用java解决输出1000以内最大的n个质数及其和。输出形式“质数1+质数2+...+质数n=的源代码

    java代码-使用java解决输出1000以内最大的n个质数及其和。输出形式“质数1+质数2+...+质数n=的源代码 ——学习参考资料:仅用于个人学习使用!

    prime-calculator:一个用 Java 编写的 GUI 多线程素数计算器

    【prime-calculator:一个用 Java 编写的 GUI 多线程素数计算器】 在计算机科学领域,素数是...这个项目的实现涉及了多种编程技术和数学知识,对于学习Java GUI编程和多线程计算的开发者来说,是一个有价值的参考案例。

    多线程和多进程的管理

    #### 三、示例代码分析 - **1号进程创建2、3号两个进程** - 使用`fork()`函数创建子进程。 - 子进程执行不同的函数来进一步创建线程或进程。 - **2号进程创建两个线程Thread1、Thread2** - 通过`pthread_create()...

    多线程异步加载多播.docx

    在本文中,我们将介绍如何使用多线程异步加载来解决单线程计算问题,并且提供了一个简单的示例代码。 多线程异步加载的原理是创建一个新的线程来执行计算任务,从而避免了单线程计算带来的卡顿问题。通过将计算任务...

    素数Java程序,用于Java第二版教材上的习题求Java素数

    这个压缩包文件“素数”可能包含了一个或多个Java源代码文件,用于解决Java第二版教材中的素数相关习题。以下将详细介绍Java编程中如何实现素数检测,并扩展到相关的数学和算法知识。 1. **素数判断算法**: - 最...

    java实现计算1亿以内的素数

    要求把所有素数输出到文本中,并记录计算过程时间、写入文本时间和执行程序总时间。 输出显示如下: ******************计算一亿以内的素数********************* 素数总数:XXXXX个 计算过程的时间:XXXXX秒 写入...

    第9章多线程第9章多线程第9章多线程第9章多线程第9章多线程第9章多线程

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个独立的任务,从而提高程序的效率和响应性。本章重点讲解了多线程的相关概念和技术。 9.1 线程概念 线程被定义为程序中的单一顺序控制流。在多线程环境...

    vc源码,多线程示例

    标题中的"vc源码,多线程示例"表明这是一个关于使用Visual C++(简称VC)进行多线程编程的源代码示例。在Windows环境下,VC是Microsoft开发的一个集成开发环境,它支持C++语言,可以用于创建各种类型的Windows应用...

Global site tag (gtag.js) - Google Analytics