我是 Java 新手,正在尝试编写一种方法来查找 2D 长数组中的最大值。
该方法在单独的线程中搜索每一行,并且线程保持共享的当前最大值。每当一个线程发现一个大于它自己的局部最大值的值时,它就会将该值与共享的局部最大值进行比较,并酌情更新其当前的局部最大值和可能的共享最大值。我需要确保实现适当的同步,以便无论计算如何交错,结果都是正确的。
我的代码冗长而凌乱,但对于初学者来说,我有这个功能:
static long sharedMaxOf2DArray(long[][] arr, int r){
MyRunnableShared[] myRunnables = new MyRunnableShared[r];
for(int row = 0; row < r; row++){
MyRunnableShared rr = new MyRunnableShared(arr, row, r);
Thread t = new Thread(rr);
t.start();
myRunnables[row] = rr;
}
return myRunnables[0].sharedMax; //should be the same as any other one (?)
}
对于改编的可运行文件,我有这个:
public static class MyRunnableShared implements Runnable{
long[][] theArray;
private int row;
private long rowMax;
public long localMax;
public long sharedMax;
private static Lock sharedMaxLock = new ReentrantLock();
MyRunnableShared(long[][] a, int r, int rm){
theArray = a;
row = r;
rowMax = rm;
}
public void run(){
localMax = 0;
for(int i = 0; i < rowMax; i++){
if(theArray[row][i] > localMax){
localMax = theArray[row][i];
sharedMaxLock.lock();
try{
if(localMax > sharedMax)
sharedMax = localMax;
}
finally{
sharedMaxLock.unlock();
}
}
}
}
}
我认为这种锁的使用将是一种防止多个线程sharedMax
一次搞乱的安全方法,但是在测试/比较同一输入上的非并发最大值查找函数时,我发现结果不正确. 我在想问题可能来自我刚才说的事实
...
t.start();
myRunnables[row] = rr;
...
在sharedMaxOf2DArray
函数中。也许给定线程需要在我将它放入 myRunnables 数组之前完成;否则,我将“捕获”错误的 sharedMax?或者是别的什么?我不确定事情的时间安排..