2 つのスレッドを使用して 2 つの行列を乗算しています (ただし、プログラムは同様にスケールアップするように記述されているため、代わりに 3 つ、4 つなどのスレッドを使用することもできます)。各スレッドは、最終的な行列の 1 つの行 (または列) の作業を計算/実行します。1 つのスレッドが行で作業を行っている場合、他のスレッドはその行で作業してはなりません。次の使用可能な行に移動する必要があります。
まず、問題を実装した方法が正しいかどうかはわかりません。見やすい方法があれば教えてください。
第二に、私が行った方法では、テストするたびに (さまざまなサイズのマトリックスで、巨大なマトリックスでも)、1 つのスレッドだけが作業を行います。つまり、毎回、同じスレッドが run() メソッドの同期ブロックにアクセスします。他のスレッドは run() メソッドに入っていますが、常に 1 つのスレッドだけがロックを取得してすべての作業を行っているのはなぜでしょうか?
これは私の実行方法です:
public void run() {
System.out.println(Thread.currentThread().getName());
while (i < number of columns in final matrix) {
synchronized (this) {
if (i < number of columns in final matrix) {
for (int j = 0; j < Main.B[0].length; j++) {
for (int k = 0; k < Main.A[0].length; k++) {
Main.C[i][j] += Main.A[i][k] * Main.B[k][j];
}
}
i++;
}
}
}
}
これは、スレッドを作成してプログラムを開始するドライバー クラスのコードです。
MyRunnable r = new MyRunnable();
Thread thread1 = new Thread(r);
Thread thread2 = new Thread(r);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException ie) {
System.out.println("\nThe following error occurred: " + ie);
}
}
私の質問は 2 つあると思います。私のアプローチは目前の問題に対して正しいですか? もしそうなら (もしそうでなければ) 1 つのスレッドが常にロックを取得し、すべての作業を行っているのはなぜですか? 20x20 行列で最大 6 つのスレッドを使用してプログラムをチェックしましたが、常に 1 つのスレッドだけが作業を行っています。