2014-12-06 54 views
0

试图获得多线程矩阵乘法以在Java中工作。给出一个(m×n)矩阵,一个(n×k)矩阵和't'个线程来执行操作。Java多线程矩阵乘法

我的程序在矩阵为正方形时t == n。当以t < n运行时,其他线程不会选取其他操作,并返回部分完成的矩阵。当矩阵不是正方形时,其他线程将返回数组越界错误,并且不会运行。我真的很感激任何建议。这里是相关的代码片段

开始线程。乘数是MatrixMultiplier的一个数组,它是稍后定义的类。

Multiply multiply = new Multiply(cols_mat,rows_mat2); 

    for (int i = 0; i < threads ; i ++){ 
     multipliers[i] = new MatrixMultiplier(multiply); 
    } 

    for (int i = 0; i < threads; i++){ 
     my_threads[i] = new Thread(multipliers[i]); 
    } 

    for (int i = 0; i < threads; i++){ 
     my_threads[i].start(); 
    } 

    for (int i = 0; i < threads ; i++){ 
     my_threads[i].join(); 
    } 

乘类定义了矩阵乘法

class Multiply extends MatrixMultiplication{ 

private int i; 
private int j; 
private int chance; 

public Multiply(int i, int j){ 
    this.i=i; 
    this.j=j; 
    chance=0; 
} 

public synchronized void multiplyMatrix(){ 

    int sum=0; 
    int a=0; 
    for(a=0; a<i; a++){ 
     sum = 0; 
     for (int b = 0; b<j; b++){ 
      sum=sum+mat[chance][b]*mat2[b][a]; 
     } 
     result[chance][a]=sum; 
    } 

    if(chance >=i) 
     return; 
    chance++; 
} 

}

和矩阵乘法

class MatrixMultiplier implements Runnable { 

private final Multiply mul; 

public MatrixMultiplier(Multiply mul){ 
    this.mul=mul; 
} 

@Override 
public void run(){ 
    mul.multiplyMatrix(); 
} 

}

在哪里我个人认为ISSU e谎言与if(机会> = i)返回;但我还没有找到一种方法将线程的列职责与程序仍在工作。再次,任何意见指向我在正确的方向将不胜感激。谢谢

回答

0

你的代码有几个问题。

t线程假定只需要t乘法来产生结果矩阵。当m!= k或t!= m或t!= k时,情况并非如此。线程是只能处理您的请求的工作线程。我会考虑让每个MatrixMultiplier可以访问mxn,nxk,mxk矩阵和一个rolcolumn条目容器。

class MatricMultiplier { 
     private double a[][], b[][], results[][]; 
     private Queue<..> entries; 
     .... 
} 

运行方法将使用条目容器来计算得到的mxk矩阵的给定条目的总和。运行方法可能变为:

run() { 
     for(Entry entry = entries.poll() ; entry != null ; entry = entries.poll()) { 
      int row = entry.row; 
      int col = entry.col; 
      double sum = 0.0; 
      for(int i = 0 ; i < a[row].length ; i++) { 
       sum += a[row][i] * b[i][col]; 
      } 
      results[row][col] = sum; 
     } 
    } 

有三件事情要注意这里是不同于你有什么。

  1. 没有使用同步块
  2. 每个条目计算结果矩阵
  3. 独特的行/列的答案多类不需要任何再

你然后可以创建处理条目容器中的每个条目的t个线程,并且当条目容器为空时将退出。

请注意,条目容器应该是java.util.concurrent包中可用的并发队列容器之一。

其余的任务是如何创建rowcolumn条目容器。以下是您可以使用的一些代码:

Queue<..> entries = new Concurrent...<..>(); 
int rowSize = a.length; 
int colSize = b[0].length; 
for(int row = 0 ; row < rowSize ; row++) { 
    for(int col = 0 ; col < colSize ; col++) { 
     entries.add(new RowColumnEntry(row,col)); 
    } 
} 

注意到a和b是mxn和nxk矩阵。

希望这会有所帮助。