java 下计算质数的多线程跟单线程执行代码分析
2012-11-20 22:29
507 查看
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笔记3 多线程<2>线程间通信-代码分析以及多线程常见方法的运用
- Java多线程--让主线程等待所有子线程执行完毕代码
- Java 线程和多线程执行过程分析
- Java多线程--JVM执行之使用HSDIS插件分析JVM代码执行细节
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数
- C++ windows多线程 线程描述了进程内代码的执行路径。进程中同时可以有多个线程在执行,为了使他们能够同时运行,操作系统为每个线程轮流分配CPU时间片,为了充分地利用CPU提高软件产品的性能,一
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数(方法一)
- 黑马程序员——java第十一、十二天:多线程(创建线程1-2、多线程同步代码、实现Runnable接口、安全死锁)
- 如何判断java多线程是否全部执行完了,并计算总耗时?
- java再复习——代码执行的大体流程与内存分析
- Java多线程系列——过期的suspend()挂起、resume()继续执行线程
- Java多线程之线程安全与异步执行
- 面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- java线程基础巩固---多线程死锁分析,案例介绍
- 一心多用多线程-future-java线程中的异步执行
- java计算一段代码执行的时间
- Java多线程--让主线程等待所有子线程执行完毕
- Toast执行完makeText之后的代码不执行(子线程中调用Toast显示异常分析)