Java n线程更新值

时间:2018-12-06 17:28:37

标签: java multithreading java-threads

我正在尝试同时运行 n 个线程。每个线程应求和不同的数组并更新全局值。

不幸的是,全局值未正确更新。

我不想使用thread.join()。

到目前为止,这是我的代码:

public class myClass {
private static class Values {
    private static double sum;

    public synchronized static void add(double dd) {
        sum += dd;
    };
    public synchronized double get() {
        return sum;
    }
}


public static double CreateThreads(double[] array) {
    final Values values = new Values();

    ...
    ...
    ...


    Thread[] threads = new Thread[nOP];

    for (int i = 0; i<threads.length; i++) {


        threads[i] = new Thread(new Runnable() {

            public void run() {

                    Values.add(sum(tab));

            }

        });
        threads[i].start();

    }

    return values.get();
}

public static void main(String[] args) throws IOException {
    double[] arr = createArray(4);
    double sumLogg = CreateThreads(arr);

    System.out.println("\n\nSum: " + sumLogg);      
}

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

在您的代码中,您以threads[i].start();开始线程,但您从未等待它们通过.join()调用完成执行。这可能会导致您的方法在所有线程完成执行之前返回 值,从而导致它返回不正确的值。

要解决此问题,请在返回值之前添加以下内容:

for(Thread t : threads) {
    t.join();
}

答案 1 :(得分:4)

如果您不想使用Thread.join,可以使用CountDountLatch:

    CountDownLatch cdl = new CountDownLatch(nOP);
    Thread[] threads = new Thread[nOP];
    for (int i = 0; i<threads.length; i++) {
        threads[i] = new Thread(new Runnable() {
            public void run() {
                values.add(sum(tab));
                cdl.countDown();
            }
        });
        threads[i].start();
    }
    cdl.await();

在这种情况下,您无需使用其他同步功能,CountDownLatch是一个 synchronzier (请参见java.util.concurrent包说明),根据其javadoc,“直到计数达到零时,从另一个线程中的相应await()成功返回之后,在调用countDown()之前的线程发生在操作之前。”