尝试使用多线程矩阵乘法在Java中工作。给出(m×n)矩阵,(n×k)矩阵和'线程来执行操作。
当矩阵为正方形且t == n时,我的程序有效。当运行t< n,其他线程不接受其他操作,并返回部分完成的矩阵。当矩阵不是方形时,附加线程返回数组超出边界错误并且不运行。我真的很感激任何建议。以下是相关的代码段
开始线程。 multipliers是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();
}
}
我个人认为问题在于if(chance&gt; = i)返回;但我还没有找到一种方法来将线程的列职责纳入程序仍然有效。再次,任何建议指向我正确的方向将非常感激。谢谢
答案 0 :(得分:0)
您的代码存在一些问题。
t个线程假设生成结果矩阵只需要t次乘法。当m!= k或t!= m或t!= k时不是这种情况。线程是仅处理您的请求的工作线程。我会考虑让每个MatrixMultiplier都能访问mxn,nxk,mxk矩阵和rolcolumn条目容器。
class MatricMultiplier {
private double a[][], b[][], results[][];
private Queue<..> entries;
....
}
然后,run方法将使用entries容器来计算生成的mxk矩阵的给定条目的总和。 run方法可以变为:
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;
}
}
这里有三件事要注意,与你的不同。
然后,您可以创建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矩阵。
希望这有帮助。