Может кто-нибудь объяснить этот Java ThreadPool? - PullRequest
0 голосов
/ 29 января 2019

Я создал FixedThreadPool для 1000 потоков.Каждый отдельный поток должен увеличивать глобальный счетчик на единицу.Так что на самом деле это часть задания по программированию, я не хочу прямого ответа, и я уже потратил несколько часов на эту проблему.

Так что некоторые советы будут с благодарностью.Итак, это мой код:

public class ThreadSpawner {
private int sum = 0;
public static void main(String[] args){
    ThreadSpawner ts = new ThreadSpawner();
    ts.doWork();

}

public void doWork(){
    ExecutorService executor = Executors.newFixedThreadPool(1000);     
    for(int i =0;i<1000;i++){
        executor.execute(new Runnable(){

            @Override
            public void run() {
                System.out.println("Value: " + sum + Thread.currentThread());
                counter();
                }

            public synchronized void counter(){
                sum++;
            }
            });
        }
        executor.shutdown();
    }
}

Назначение специально задает вопрос: "Напишите программу, которая запускает 1000 потоков. Каждый поток добавляет 1 к переменной sum, которая изначально равна 0. Определите оболочку IntegerОбъект для хранения суммы. Запустите программу с синхронизацией и без нее, чтобы увидеть ее эффект. Вы можете использовать newFixedThreadPool () для создания фиксированного числа потоков в пуле."

Я уже пробовалс отдельным запускаемым классом задач для потоков.Однако я не могу найти способ редактировать переменную суммы из потоков.

Этот способ внутреннего потока, который я использую сейчас, по крайней мере, показывает несколько правильное поведение.

Может ли кто-нибудь рассказать о том, что было бы более правильным способом решения такой проблемы?

  • Я также не уверен относительно того, как и где правильно реализовать ключевое слово синхронизациизаставить потоки синхронизироваться.

С уважением!Sietze

1 Ответ

0 голосов
/ 31 января 2019

Для всех, кто заинтересовался, пришло решение от автора.Я считаю плохой практикой размещать такие решения здесь, я удалю их.

import java.util.concurrent.*;

public class Exercise30_04 {
  private int sum = new Integer(0);

  public static void main(String[] args) {
    Exercise30_04 test = new Exercise30_04();
    System.out.println("What is sum ? " + test.sum);
  }

  public Exercise30_04() {
    ExecutorService executor = Executors.newFixedThreadPool(1000);

    for (int i = 0; i < 1000; i++) {
      executor.execute(new SumTask());
    }

    executor.shutdown();

    while(!executor.isTerminated()) {
    }
  }

  class SumTask implements Runnable {
    public void run() {
      sum++;
//      int value = sum.intValue() + 1;
//      sum = new Integer(value);
    }
  }
}

Похоже, что это решение дает правильный результат 1000 без синхронизированного ключевого слова.

Так имеет ли смысл использовать здесь синхронизированное ключевое слово?Лично я поместил его в метод run класса runnable.

В любом случае спасибо всем за ответ.

...