Как убедиться, что потоки выполняются полностью? (используя пул потоков) - PullRequest
0 голосов
/ 04 июня 2019

Моя задача - создать программу, в которой 3 координатора добавляют 200 студентов к 1 курсу.Я использую пул потоков и, в конце концов, печатаю массив номеров студентов, которые были зачислены на курс.

По какой-то причине - в большинстве случаев, когда я запускаю основную программу java, она действительно добавляет 200 студентов в массив - но!время от времени он назначает меньше и говорит мне, что размер массива составляет 160, 170 ... Пожалуйста, если вы видите, что является причиной этого, я бы хотел немного помочь.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ClassMain
{
    public static void main(String[] args)
    {
        ExecutorService executor = Executors.newFixedThreadPool(3);

        for (int i = 1; i <= 200 ;i++) {
            Runnable coordinator = new Coordinator(i);
            executor.execute(coordinator);
        }

        executor.shutdown();

        while (!executor.isTerminated());

        Coordinator.print();
    }
}
import java.util.ArrayList;

public class Coordinator implements Runnable
{
    public static ArrayList<Integer> javaStudents;

    private int studentNumber;

    public Coordinator(int studentNum)
    {
        studentNumber = studentNum;
        javaStudents = new ArrayList<Integer>();
    }

    public static synchronized void processCommand(int studentNumber)
    {
        javaStudents.add(studentNumber);
    }

    @Override
    public void run()
    {
        System.out.println(Thread.currentThread().getName() + " Starting to add student# " + studentNumber + " to Java");
        processCommand(studentNumber);
        System.out.println(Thread.currentThread().getName() +" Ended adding student#" + studentNumber + " to Java");
    }

    public static void print()
    {
        for (int i = 0; i < javaStudents.size(); i++) {
            System.out.println("Student #" +javaStudents.get(i) + " enrolled to Java");
        }
        System.out.println("Array size: " + javaStudents.size());
    }
}

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

1 Ответ

2 голосов
/ 04 июня 2019

Эта строка в вашем конструкторе Coordinator является проблемой:

javaStudents = new ArrayList<Integer>()

Вы перезаписываете поле static javaStudents каждый раз, когда создается Coordinator.Удалите эту строку и измените объявление поля static на:

public static ArrayList<Integer> javaStudents = new ArrayList<>();
...