Java 多线程无法与我一起工作
我要写一个程序,求一个int的2D数组的和, 据我所知,我对每一件事都进行了编码,没有语法错误,但当我使用某些方法检查代码时,线程根本不工作,但有时工作一些线程,而不是所有线程 我用数字1来检查总和 我加了锁,以确保在相同的求和方法中不存在两个线程 和n来查看它加入add方法的时间Java 多线程无法与我一起工作,java,arrays,multithreading,Java,Arrays,Multithreading,我要写一个程序,求一个int的2D数组的和, 据我所知,我对每一件事都进行了编码,没有语法错误,但当我使用某些方法检查代码时,线程根本不工作,但有时工作一些线程,而不是所有线程 我用数字1来检查总和 我加了锁,以确保在相同的求和方法中不存在两个线程 和n来查看它加入add方法的时间 public class extend extends Thread { int a, b; private static int sum = 0; static int n; bo
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);
}
}
public类扩展线程{
INTA,b;
私有静态整数和=0;
静态int n;
布尔锁;
int[]arr;
公共扩展(){
arr=新整数[45][45];
对于(int i=0;i<45;i++){
对于(int j=0;j<45;j++)
arr[i][j]=1;
}
n=0;
锁=假;
}
公共扩展(内部a、内部b){
arr=新整数[45][45];
对于(int i=0;i<45;i++){
对于(int j=0;j<45;j++)
arr[i][j]=1;
}
n=0;
锁=假;
这个a=a;
这个.b=b;
}
公开募捐{
添加(a,b);
}
公共无效添加(int st,int e){
n++;
while(锁);
lock=true;
整数和=0;
已同步(此){
for(int i=st;i
很抱歉,这段代码有太多错误,很难指出一个问题:
.join()
Thread
,实际上是指实现Runnable
while(true)
静态int
进行计数 t1.join();
...
t5.join();
在考虑到创建
线程的开销时,锁定sum
变量甚至可能不会导致加速,但您的主要问题是没有将sums
添加到sum
更改:
sum=总和代码>
致:
sum+=总和代码>
这将使您的代码在某些时候工作。它不能保证工作,有时会输出奇怪的结果,如1620年而不是2025年。您应该了解更多有关如何正确处理多线程、竞争条件和原子锁的信息。谢谢您,谢谢您,请允许我再问您一个问题:我可以在eclipse中编写多线程,还是应该在终端中编写,为了查看执行时间,我做了,但是方法在正确的位置上并不重要。它将同样被执行。