多线程无法与我一起使用

时间:2018-08-02 21:42:32

标签: java arrays multithreading

我必须编写一个程序,以找到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);

    }

}

2 个答案:

答案 0 :(得分:2)

很抱歉,但是这段代码有很多错误,很难指出一个问题:

  1. 您启动了线程,但不必等待它们完成使用.join()
  2. 在您实际打算实施Thread时扩展Runnable
  3. 使用while (true)在线程中忙于等待
  4. 使用static int进行计数

但是,如果您只需要修复一件事,请等待线程:

    t1.join();
    ...
    t5.join();

答案 1 :(得分:1)

考虑到创建sum的开销,您对Thread变量的锁定甚至可能不会导致加速,但是您的主要问题是您没有将sums添加到sum


更改:

sum = sums;

收件人:

sum += sums;

这将使您的代码在某些时间工作。它不能保证能正常工作,有时会输出奇怪的结果,例如1620而不是2025。您应该了解更多有关如何正确处理多线程,竞争条件和原子锁的信息。