首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 云计算 >

多线程程序在单核CPU下运行,耗时为0毫秒是什么原因?该怎么解决

2012-03-03 
多线程程序在单核CPU下运行,耗时为0毫秒是什么原因?Java codepackage test/*** @Title: MultiThreadMatri

多线程程序在单核CPU下运行,耗时为0毫秒是什么原因?

Java code
package test;/**    * @Title: MultiThreadMatrix.java * @Package matrix * @Description: 多线程计算矩阵乘法 * @author Aloong * @date 2010-10-28 下午09:45:56 * @version V1.0 */ import java.util.Date;public class MultiThreadMatrix{        static int[][] matrix1;    static int[][] matrix2;    static int[][] matrix3;    static int m,n,k;    static int index;    static int threadCount;    static long startTime;        public static void main(String[] args) throws InterruptedException    {        //矩阵a高度m=100宽度k=80,矩阵b高度k=80宽度n=50 ==> 矩阵c高度m=100宽度n=50        m = 1024;        n = 1024;        k = 1024;        matrix1 = new int[m][k];        matrix2 = new int[k][n];        matrix3 = new int[m][n];                //随机初始化矩阵a,b        fillRandom(matrix1);        fillRandom(matrix2);        startTime = new Date().getTime();                //输出a,b//        printMatrix(matrix1);      //  printMatrix(matrix2);                //创建线程,数量 <= 4        for(int i=0; i<4; i++)        {            if(index < m)            {                Thread t = new Thread(new MyThread());                t.start();            }else             {                break;            }        }                //等待结束后输出        while(threadCount!=0)        {            Thread.sleep(20);        }               // printMatrix(matrix3);        long finishTime = new Date().getTime();        System.out.println("计算完成,用时"+(finishTime-startTime)+"毫秒");    }        static void printMatrix(int[][] x)    {        for (int i=0; i<x.length; i++)        {            for(int j=0; j<x[i].length; j++)            {                System.out.print(x[i][j]+" ");            }            System.out.println("");        }        System.out.println("");    }        static void fillRandom(int[][] x)    {        for (int i=0; i<x.length; i++)        {            for(int j=0; j<x[i].length; j++)            {                //每个元素设置为0到99的随机自然数                x[i][j] = (int) (Math.random() * 100);            }        }    }    synchronized static int getTask()    {        if(index < m)        {            return index++;        }        return -1;    }}class MyThread implements Runnable{    int task;    @Override    public void run()    {        MultiThreadMatrix.threadCount++;        while( (task = MultiThreadMatrix.getTask()) != -1 )        {            //System.out.println("进程: "+Thread.currentThread().getName()+"\t开始计算第 "+(task+1)+"行");            for(int i=0; i<MultiThreadMatrix.n; i++)            {                for(int j=0; j<MultiThreadMatrix.k; j++)                {                    MultiThreadMatrix.matrix3[task][i] += MultiThreadMatrix.matrix1[task][j] * MultiThreadMatrix.matrix2[j][i];                }            }        }        MultiThreadMatrix.threadCount--;    }}


上面的代码是用来计算1024*1024矩阵乘积的,但有时候运行结果会是:
计算完成,用时0毫秒
进程: Thread-0开始计算第 1行
进程: Thread-0开始计算第 2行
进程: Thread-1开始计算第 3行
进程: Thread-1开始计算第 4行
进程: Thread-2开始计算第 5行
。。。。。。
有时候会有期望的结果(比如耗时23毫秒),是什么原因呢?
另外,想确认一下:单核CPU下仅仅靠线程级并行能提高计算速度吗?我的测试结果是不能 !比如上面这个程序,和我直接写一个O(n^3)的程序相比,时间还多出些许毫秒(原因可能是:线程数太多,每个线程的工作量太小,CPU把时间都花在线程调度上了,所以并行的结果反而还不如串行。)

[解决办法]
神马都是浮云。单核CPU无法靠线程并行提高计算速度

热点排行