2

並列行列の加算と乗算をシミュレートするプログラムを作成する必要があります。A、B、C の 3 つの行列があり、A+B = C または A*B = 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は、特定の行と列に必要な合計を計算し、それを行列 C のその行と列に入れるランナブルを作成しますMatrixProductThread

私が持っているかどうかを確認する方法についてのアイデア:

someMatrixMathObject.add(A,B,C);
someMatrixMathObject.multiply(A,B,C);

の前に確実にadd仕上げることができmultiplyますか、またはその逆ですか? 助けてくれてありがとう。

4

1 に答える 1

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();
}
于 2013-10-23T21:29:08.597 に答える