java为什么当线程数增加时程序会变慢
我是java的初学者
最近,我在写一个计算矩阵乘法的程序。所以我写了一个类来做这个
public class MultiThreadsMatrixMultipy{
public int[][] multipy(int[][] matrix1,int[][] matrix2) {
if(!utils.CheckDimension(matrix1,matrix2)){
return null;
}
int row1 = matrix1.length;
int col1 = matrix1[0].length;
int row2 = matrix2.length;
int col2 = matrix2[0].length;
int[][] ans = new int[row1][col2];
Thread[][] threads = new SingleRowMultipy[row1][col2];
for(int i=0;i<row1;i++){
for(int j=0;j<col2;j++){
threads[i][j] = new SingleRowMultipy(i,j,matrix1,matrix2,ans));
threads[i][j].start();
}
}
return ans;
}
}
public class SingleRowMultipy extends Thread{
private int row;
private int col;
private int[][] A;
private int[][] B;
private int[][] ans;
public SingleRowMultipy(int row,int col,int[][] A,int[][] B,int[][] C){
this.row = row;
this.col = col;
this.A = A;
this.B = B;
this.ans = C;
}
public void run(){
int sum =0;
for(int i=0;i<A[row].length;i++){
sum+=(A[row][i]*B[i][col]);
}
ans[row][col] = sum;
}
}
我想用一个线程来计算matrix1[i][:] * matrix2[:][j]
,矩阵的大小是1000*5000
和5000*1000
,所以线程的数量是1000*1000。当我运行这个程序时,它的速度非常慢,而且成本大约为38s
。如果我只使用single-thread
来计算结果,它将花费17s
。单线程代码如下所示:
public class SimpleMatrixMultipy
{
public int[][] multipy(int[][] matrix1,int[][] matrix2){
int row1 = matrix1.length;
int col1 = matrix1[0].length;
int row2 = matrix2.length;
int col2 = matrix2[0].length;
int[][] ans = new int[row1][col2];
for(int i=0;i<row1;i++){
for(int j=0;j<col2;j++){
for(int k=0;k<col1;k++){
ans[i][j] += matrix1[i][k]*matrix2[k][j];
}
}
}
return ans;
}
}
我能做些什么来加速程序
# 1 楼答案
正如@Turing85所说,需要管理线程数。有两种方法,一种是将
Executors.newFixedThreadPool
用于固定数量的线程,另一种是使用Executors.newCachedThreadPool
来使用现有的可用线程另一个要点是避免直接继承
Thread
类,而是实现runnable