我必须编写一个程序,以找到int的2D数组的总和, 据我所知,我对每件事都进行了编码,没有语法错误,但是当我使用某种方式检查我的代码时,该线程根本无法工作,但有时可以工作一部分线程,而并非全部 我把数字1检查总和 而且我放了锁以确保同一求和方法中没有两个线程只是为了确保 和n表示加入add方法需要多少时间
public class extend extends Thread {
int a, b;
private static int sum = 0;
static int n;
boolean lock;
int[][] arr;
public extend() {
arr = new int[45][45];
for (int i = 0; i < 45; i++) {
for (int j = 0; j < 45; j++)
arr[i][j] = 1;
}
n = 0;
lock = false;
}
public extend(int a, int b) {
arr = new int[45][45];
for (int i = 0; i < 45; i++) {
for (int j = 0; j < 45; j++)
arr[i][j] = 1;
}
n = 0;
lock = false;
this.a = a;
this.b = b;
}
public void run() {
add(a, b);
}
public void add(int st, int e) {
n++;
while (lock) ;
lock = true;
int sums = 0;
synchronized (this) {
for (int i = st; i < e; i++) {
for (int j = 0; j < 45; j++) {
sums += arr[i][j];
}
}
}
sum = sums;
lock = false;
}
public int getSum() {
return sum;
}
public static void main(String[] args) {
long ss = System.currentTimeMillis();
Thread t1 = new Thread(new extend(0, 9));
Thread t2 = new Thread(new extend(9, 18));
Thread t3 = new Thread(new extend(18, 27));
Thread t4 = new Thread(new extend(27, 36));
Thread t5 = new Thread(new extend(36, 45));
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
long se = System.currentTimeMillis();
System.out.println("The sum for 45*45 array is: " + sum);
System.out.println("time start;" + (se - ss));
System.out.print(n);
}
}
答案 0 :(得分:2)
很抱歉,但是这段代码有很多错误,很难指出一个问题:
.join()
Thread
时扩展Runnable
while (true)
在线程中忙于等待static int
进行计数但是,如果您只需要修复一件事,请等待线程:
t1.join();
...
t5.join();
答案 1 :(得分:1)
考虑到创建sum
的开销,您对Thread
变量的锁定甚至可能不会导致加速,但是您的主要问题是您没有将sums
添加到sum
。
sum = sums;
收件人:
sum += sums;
这将使您的代码在某些时间工作。它不能保证能正常工作,有时会输出奇怪的结果,例如1620而不是2025。您应该了解更多有关如何正确处理多线程,竞争条件和原子锁的信息。