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

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

2013-01-05 
多线程程序在单核CPU下运行,耗时为0毫秒是什么原因?package test/*** @Title: MultiThreadMatrix.java *

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

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无法靠线程并行提高计算速度

热点排行