javanthreads更新值

guicsvcw  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(244)

我试图同时运行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);      
}

有什么想法吗?

oxosxuxt

oxosxuxt1#

在你的代码中,你要用 threads[i].start(); 但你永远不会等着他们完成一个任务 .join() 打电话。这可能会导致您的方法在所有线程完成执行之前返回一个值,从而导致它返回一个不正确的值。
要解决此问题,请在返回值之前添加类似的内容:

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

alen0pnh2#

如果不想使用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是一个同步器(请参阅java.util.concurrent包描述)并根据其javadoc“直到计数达到零,调用countdown()之前线程中的操作发生在另一个线程中相应的await()成功返回之后的操作之前。”

相关问题