【发布时间】:2018-07-12 22:47:02
【问题描述】:
我正在尝试构建一个程序,用于使用 a*d 线程将两个矩阵 (A[a,b], B[c,d]) 相乘(用于打印完成后的一个索引的总和)矩阵),为此,我使用了一个“监视器”类,该类将用作在线程之间同步的控制器,“乘数”类表示单个线程和一个主程序类。我的想法是线程将进行计算,当 thread(0,0) 打印他的总和时,他将发出下一个信号。出于某种原因,在打印第一个索引后 - 所有线程都处于等待模式,不会测试我的状况。你能看看我的代码并告诉我我的错误在哪里吗?
监控类:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
final class Monitor {
private Lock lock;
int index;
Condition cond;
public Monitor () {
lock = new ReentrantLock();
cond = lock.newCondition();
this.index = 0;
}
public synchronized void finished(int x, double sum) throws InterruptedException {
lock.lock();
if(index != x) {
while(index != x) cond.await();
System.out.printf("%9.2f ",sum);
index++;
lock.unlock();
cond.signalAll();
}
else {
System.out.printf("%9.2f ",sum);
index++;
try { lock.unlock(); }
catch (java.lang.IllegalMonitorStateException e) {};
try { lock.unlock(); }
catch (java.lang.IllegalMonitorStateException e) {};
}
if(index % 5 == 0) System.out.println();
}
}
乘数:
public class Multiplier extends Thread {
private int index;
private double [] vectorOne;
private double [] vectorTwo;
private Monitor monitor;
private double sum;
//constructor
public Multiplier(int index, Monitor monitor,double [] vectorOne,double [] vectorTwo) {
this.index = index;
this.monitor = monitor;
this.vectorOne = vectorOne;
this.vectorTwo = vectorTwo;
}
public void VecMulti() {
sum = 0;
for (int i = 0 ; i < vectorOne.length ; i++)
sum += vectorOne[i] * vectorTwo[i];
}
public double getSum() {
return sum;
}
public void run() {
VecMulti();
try {
monitor.finished(index, sum);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
主类:
public class MatrixMultiTest {
public static void main(String[] args) {
Monitor monitor = new Monitor(3*5);
Matrix A = Matrix.random(3,4);
Matrix B = Matrix.random(4,5);
System.out.println("Matrix No1");
A.show();
System.out.println();
System.out.println("Matrix No2");
B.show();
System.out.println();
System.out.println("Multi Matrix");
for (int i = 0; i < 3; i++)
for (int j = 0; j < 5; j++) {
Multiplier myThr = new Multiplier(i*5+j,
monitor,A.getRow(i),B.getCol(j));
myThr.start();
try {
myThr.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
【问题讨论】:
-
while(index != x)永远不会停止,因为方法参数 x 和 index 永远不会改变,你需要检查一个变量 shared amonst all threads ,这里java是按值复制的。 -
@zapl 'monitor'上的索引不是可以被认为是与所有线程共享的值吗?只要线程“完成”运行,它就会发生变化。
-
哦,天哪,
index确实是一个共享变量。我会尝试new Multiplier(i*5+j..一个,否则你的索引搞砸了 -
让我们打个赌:如果您将多线程解决方案与简单的单线程解决方案进行基准测试,那么您的解决方案会慢得多……至少尺寸约为 10*10,正如您介绍的那样操作的巨大开销。
-
@RalfKleberhoff 也许吧,但这不是重点。我不打算在这项任务上效率。
标签: java multithreading matrix conditional wait