Java нить обновляет значение - PullRequest
       27

Java нить обновляет значение

0 голосов
/ 06 декабря 2018

Я пытаюсь запустить 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 голосов
/ 06 декабря 2018

Если вы не хотите использовать 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 "Пока счетчик не достигнет нуля, действия в потоке до вызова countDown () произойдут до действия после успешного возврата из соответствующего await () в другом потоке."

0 голосов
/ 06 декабря 2018

В вашем коде вы запускаете потоки с threads[i].start();, но никогда не ждете, когда они завершат выполнение с вызовом .join().Это может привести к тому, что ваш метод вернет значение до того, как все ваши потоки завершат выполнение, в результате чего он вернет неправильное значение.

Чтобы исправить это, добавьте что-то подобное перед возвратом значения:

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