实验:多线程求素数

实验名称:多线程求素数
实验目的:验证多线程的高效率。
实验任务:求[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%;

对比发现,将任务分解成多线程的方案,优势还是比较明显的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值