我正在使用两个线程将两个矩阵相乘(但是,该程序也被编写为按比例放大,因此我可以使用三个、四个等线程代替)。每个线程计算/完成最终矩阵的一行(或列)的工作。如果一个线程在一行上工作,那么其他线程不应该在该行上工作。它/他们应该移动到下一个可用行。
首先,我不确定我实现问题的方式是否正确。如果你能看到更好的方法,请告诉我。
其次,按照我的做法,每次我测试它(使用不同大小的矩阵——甚至是巨大的矩阵)时,只有一个线程可以完成这项工作。也就是说,每次都是同一个线程访问 run() 方法的同步块。其他线程都进入了 run() 方法,但为什么只有一个线程总是获得锁并完成所有工作?
这是我的运行方法:
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);
}
}
我想我的问题是双重的——我的方法对于手头的问题是否正确?如果是这样,(如果不是),为什么一个线程总是抓住锁并完成所有工作?我已经在 20x20 矩阵上检查了最多 6 个线程的程序,并且总是只有一个线程在做这项工作。