Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程无法与我一起工作_Java_Arrays_Multithreading - Fatal编程技术网

Java 多线程无法与我一起工作

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

我要写一个程序,求一个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);

    }

}
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中编写多线程,还是应该在终端中编写,为了查看执行时间,我做了,但是方法在正确的位置上并不重要。它将同样被执行。