Добавление продукта потока в массив - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно добавить объекты пула потоков в ArrayList, чтобы подсчитать общее количество объектов, созданных моим пулом потоков. Для этого я создал ArrayList, и после выполнения пула потоков я добавляю объект в ArrayList. Моя проблема в том, что новые пулы потоков перезаписывают существующий объект в моем Arraylist, и поэтому Arraylist всегда будет иметь одинаковый размер, независимо от того, сколько раз будет выполняться код.

My ArrayList:

 protected ArrayList<Runnable> ComponentBuild = new ArrayList<>();

Где начались потоки:

public void tireComponent() {
    Menu menu = new Menu();
    ExecutorService executor = Executors.newFixedThreadPool(3);
    //  ThreadPoolExecutor executor = new ThreadPoolExecutor();

    for (int i = 1; i <= 3; i++) {
        Runnable tire = new Tire("" + i);
        executor.execute(tire);
        ComponentBuild.add(tire);
        System.out.println(ComponentBuild);
        if (ComponentBuild.size() == MAX_CAPACITY) {
            sleep();
        }
    }

Класс шин:

public class Tire implements Runnable, Component {

    private String number;

    public Tire(String Number) {
        this.number = Number;
    }

    @Override
    public void run() {
        System.out.println("Tire number " + number + " has now begun creation");

        processCommand();

        System.out.println("Thread " + Thread.currentThread().getName() + " has now created number " + number + " tire");
    }

    private void processCommand() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String toString() {
        return this.number;
    }
}

Результат в терминале:

You have the following options: 
1) Create normal trie
2) Create winter tire
3) Create premium tire
1
[1]
Tire number 1 has now begun creation
[1, 2]
Tire number 2 has now begun creation
[1, 2, 3]

You have the following options: 
1) Create normal trie
2) Create winter tire
3) Create premium tire
Tire number 3 has now begun creation
Thread pool-1-thread-2 has now created number 2 tire
Thread pool-1-thread-1 has now created number 1 tire
Thread pool-1-thread-3 has now created number 3 tire
1
[1]
Tire number 1 has now begun creation
[1, 2]
Tire number 2 has now begun creation
[1, 2, 3]
You have the following options: 
1) Create normal trie
2) Create winter tire
3) Create premium tire
Tire number 3 has now begun creation
Thread pool-2-thread-1 has now created number 1 tire
Thread pool-2-thread-2 has now created number 2 tire
Thread pool-2-thread-3 has now created number 3 tire

Мне бы хотелось, чтобы вывод был таким:

Tire number 2 has now begun creation
[1, 2, 3, 4, 5, 6]

Но фактический вывод - это второй пул потоков, перезаписывающий существующие объекты в моем массиве, поэтому как быМного раз я запускаю код, ArrayList всегда будет:

[1, 2, 3]

Редактировать: В соответствии с запросом, интерфейс моего компонента:

package Model;

public interface Component {

 void run();
 String toString();
}

1 Ответ

0 голосов
/ 18 октября 2019

Вы выполняете свой цикл только три раза «для (int i = 1; i <= 3; i ++)», поэтому в нем будет только три. Если вы хотите больше, вам нужно увеличить размер петли. </p>

...