实验名称:多线程求素数
实验目的:验证多线程的高效率。
实验任务:求[2,199999]范围内的所有素数并计算耗时。
实验环境:双核普通笔记本。
实验设计:
方案一:多线程分段求素数
分段范围[m,n]:线程0负责范围[2,99999], 线程1负责范围[100000,199999]
统计最长进程的耗时
方案二:单线程求素数
范围[m,n]:线程0负责范围[2,199999]
统计耗时
比较两种方案的耗时
实验过程:
多线程方案的源码如下:
package Thread.testThread.多线程求素数;
// 实验:多线程求素数
public class MultiThread extends Thread {
int m, n;
long timeStamp_start, timeStamp_end;
MultiThread(int m0, int n0) {
m = m0;
n = n0;
}
@Override
public void run() {
// 开始计时
timeStamp_start = System.currentTimeMillis();
System.out.print("\t**" + Thread.currentThread().getName() + " running(m=" + m + " n=" + n + ")...**\t");
// 计算素数
for (int i = m; i <= n; i++) {
int isPrime = 1;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = 0;
}
}
if (isPrime == 1) {
System.out.print(i + " ");
}
// Thread.sleep(500);
}
// 计算耗时
timeStamp_end = System.currentTimeMillis();
long milliseconds = timeStamp_end - timeStamp_start;
System.out.print("\t**" + Thread.currentThread().getName() + " done! 耗时(毫秒):" + milliseconds + "**\t");
}
public static void main(String[] args) {
// 方案一:多线程求素数
MultiThread t0 = new MultiThread(2, 99999);
MultiThread t1 = new MultiThread(100000, 199999);
t0.start();
t1.start();
/
// 方案二:单线程求素数
// MultiThread t0 = new MultiThread(2, 199999);
// t0.start();
}
}
多线程方案的结果
以最长进程的耗时作为该方案的耗时。连续进行了5次实验,多线程方案的平均耗时为:
(76883+78138+74797+77632+77527)/5 =76995 (毫秒)
单线程方案的源码如下(注释掉多线程部分,恢复单线程部分,其余不变):
public static void main(String[] args) {
// 方案一:多线程求素数
//MultiThread t0 = new MultiThread(2, 99999);
//MultiThread t1 = new MultiThread(100000, 199999);
//t0.start();
//t1.start();
/
// 方案二:单线程求素数
MultiThread t0 = new MultiThread(2, 199999);
t0.start();
}
单线程方案的结果:
同样连续进行了5次实验,单线程方案的平均耗时为:
(93552+92499+93083+91808+95609)/5 =93310 (毫秒)
实验结论:
多线程的耗时比单线程的减少了 (93310-76995)/93310=0.175=17.5%;
单线程的耗时比多线程的增加了 (93310-76995)/76995=0.212=21.2%;
对比发现,将任务分解成多线程的方案,优势还是比较明显的。