【问题标题】:the multithread not working with me多线程不适用于我
【发布时间】:2018-08-02 21:42:32
【问题描述】:

我必须编写一个程序来找到一个二维 int 数组的总和, 我编写了我所知道的所有内容,并且没有语法错误,但是当我使用某种方式检查我的代码时,线程根本不工作,但有时会工作一些线程而不是全部 我把数字 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);

    }

}

【问题讨论】:

    标签: java arrays multithreading


    【解决方案1】:

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

    1. 你开始你的线程,但你不等待他们完成使用.join()
    2. 扩展 Thread 当你实际上意味着实现 Runnable
    3. 在您的线程中使用忙等待while (true)
    4. 使用static int进行计数

    但是,如果您只有一件事必须解决,请等待您的线程:

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

    【讨论】:

    • 谢谢你??它现在正常工作并原谅我,我还是学生,我只是学习操作系统课程和线程对象,再次感谢你的帮助❤️
    • 请让我再问你一个问题:我可以在 Eclipse 中编写多线程代码,还是应该在终端中编写代码,并查看执行时间,但方法在正确的位置跨度>
    • 你的代码并不重要。它将执行相同的操作。
    【解决方案2】:

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


    改变:

    sum = sums;

    到:

    sum += sums;

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

    【讨论】:

    • 谢谢你,在我只使用 sum 之前,当我认识到存在不同的总和时,我添加总和来划分总和
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2014-11-12
    相关资源
    最近更新 更多