所有java线程都在一个内核上运行,最终会花费太多的时间来执行

所有java线程都在一个内核上运行,最终会花费太多的时间来执行,java,multithreading,synchronization,cpu-usage,Java,Multithreading,Synchronization,Cpu Usage,这是我的家庭作业问题: 我必须做矩阵乘法。我的代码应该为结果矩阵中的每个元素创建一个线程。i、 例如,如果生成的矩阵是mXn大小,那么应该有m*n个线程 (第179页) 是的,我自己完成了。这在我所有的测试用例中都执行得很好。不幸的是,我最终得到了70%的积分:( 这是我的代码和测试用例 当我和我的教授讨论我的分数时,他告诉我,我的代码太长,无法执行更大的矩阵 我和他争辩说,这是一种预期行为,因为大数据显然需要更多的时间。然而,他不同意我的观点 我附上了我的代码和测试用例。我的代码需要3个小时

这是我的家庭作业问题: 我必须做矩阵乘法。我的代码应该为结果矩阵中的每个元素创建一个线程。i、 例如,如果生成的矩阵是mXn大小,那么应该有m*n个线程

(第179页)

是的,我自己完成了。这在我所有的测试用例中都执行得很好。不幸的是,我最终得到了70%的积分:( 这是我的代码和测试用例

当我和我的教授讨论我的分数时,他告诉我,我的代码太长,无法执行更大的矩阵

我和他争辩说,这是一种预期行为,因为大数据显然需要更多的时间。然而,他不同意我的观点

我附上了我的代码和测试用例。我的代码需要3个小时。根据我的教授,执行只需要5分钟

在过去的几天里,我一直在想办法,但找不到确切的解决办法:(

我的代码概要

ExecutorService executor = Executors
                .newFixedThreadPool(threadCount); // creating thread pool
                                                    // with fixed threads
        int mRRowLen = matrix1.length; // m result rows length
        int mRColLen = matrix2[0].length; // m result columns length
        mResult = new long[mRRowLen][mRColLen];
        for (int i = 0; i < mRRowLen; i++) { // rows from m1
            for (int j = 0; j < mRColLen; j++) { // columns from m2
                Runnable r = new MatrixMultipliactionThread(matrix1ColLen, i, j, matrix1,
                        matrix2);
                executor.execute(r);
            }
        }
        executor.shutdown();
        while (!executor.isTerminated()) {
            // wait untill it get shutdown 
        }
executor服务executor=执行者
.newFixedThreadPool(threadCount);//创建线程池
//螺纹固定
int mRRowLen=matrix1.length;//m结果行长度
int mRColLen=matrix2[0]。长度;//m结果列长度
mResult=新长[mRRowLen][mrcolen];
对于(int i=0;i
运行方法:

public void run() {

        for (int k = 0; k < m1ColLength; k++) { // columns from m1
            Matrix.mResult[i][j] += matrix1[i][k] * matrix2[k][j];
    }
public void run(){
对于(int k=0;k

提前感谢

好的,我下载了你的zip并运行了程序。你的问题根本不在于矩阵乘法。注释中关于减少线程数的建议仍然有效,但目前乘法发生得很快

实际的问题在于
writetaffile
方法——在乘法已经完成之后,您看到的所有单线程CPU利用率实际上都发生在那里

添加字符串的方式:

fileOutputString = fileOutputString + resultMatrix[i][j]
创建数千个新的
String
对象,然后这些对象立即变成垃圾;这是非常低效的。您应该使用
StringBuilder
来代替,如下所示:

StringBuilder sb=new StringBuilder();
for (int i = 0; i < resultMatrix.length; i++) {
    for (int j = 0; j < resultMatrix[i].length; j++) {
        sb.append(resultMatrix[i][j]);
        if (j != resultMatrix[i].length - 1) sb.append(",");
    }
    sb.append("\n");
}

String fileOutputString=sb.toString();
StringBuilder sb=新建StringBuilder();
对于(int i=0;i

该代码在几分之一秒内执行。

我不打算下载一个zip文件并扔掉整个代码。将您认为重要的代码片段张贴在此处。如果生成的矩阵是mXn矩阵,则会有mXn线程:这根本不是一个好主意。您的机器的内核比这少得多,创建这么多线程会带来很多麻烦使用大量CPU和内存来执行一个微小的操作。如果使用单个线程,乘法运算可能会快得多。如果将任务划分为线程,那么线程的数量应该与机器上的内核数量一样多。并且推测
threadCount
不是
1
?您的紧密循环f
而(!executor.isTerminated()){}
不会有任何帮助…请注意,如果您的代码执行速度是好的解决方案的36倍,那么这不太可能完全是由于线程问题,除非5分钟的版本是在一台怪物机器(或多台机器)上执行的