我必须创建一个模拟并发矩阵加法和乘法的程序。我意识到如果我有3个矩阵:A,B和C,并且我想计算A + B = C或A * B = C,那么我可以创建的最大线程数是(C中的行)*( C)中的列,因为矩阵C中的每个最终位置都可以独立于其他位置进行计算。
我真正的问题是:如果我的接口MatrixMath
有方法multiply(), add(), print()
,那么当add()
或multiply()
方法终止时,我怎样才能确保更改是写入产品或总和矩阵吗?
示例:
class MatrixMathImplementation implements MatrixMath {
public void multiply(int[][]A, int[][]B, int[][]C) {
//multiply the two matrices, spawning m*n threads
//haven't coded this yet
}
public void add(int[][]A, int[][]B, int[][]C) {
//add the two matricies, spawning m*n threads
//First: Check that A, B, and C are all the same size
if (A.length == B.length && A.length == C.length &&
A[0].length == B[0].length && A[0].length == C[0].length) {
for (int row=0; row < A.length; row++) {
for (int col=0; col < A[0].length; col++) {
new MatrixSumThread(A,B,C,row,col);
}
}
} else {
System.out.println("ERROR: Arrays are not the same size.");
}
}
}
public void print() {
//print the given matrix
//doesn't need to be concurrent, haven't coded this yet either.
}
}
在代码中,MatrixSumThread
创建一个runnable,它将计算特定行和列所需的总和,并将其放入矩阵C中的该行和列中。我将为{创建一个类似的runnable类{1}}。
关于如何确保如果我有任何想法:
MatrixProductThread
我可以确保someMatrixMathObject.add(A,B,C);
someMatrixMathObject.multiply(A,B,C);
在add
之前完成,反之亦然?谢谢你的帮助。
答案 0 :(得分:2)
一般来说,这是您使用原始线程的方式:
Thread t = new Thread(); // or subclass thereof
t.start(); // make sure to not start threads in the constructor; start explicitly
t.join(); // waits for the thread to finish
在你的情况下:
// create a list to hold all your threads, above the for loops
List<MatrixSumThread> threads = new ArrayList<MatrixSumThread>();
// for() { ...
// make sure MatrixSumThread doesn't call start() in its constructor
MatrixSumThread t = new MatrixSumThread(A,B,C,row,col);
threads.add(t);
t.start();
然后,在完成for循环后,加入所有线程:
for (MatrixSumThread t in threads) {
t.join();
}