Как хранить элементы в одном массиве, используя два потока в Java? - PullRequest
0 голосов
/ 09 октября 2018

В моем примере я хочу заполнить myArray от индексов 0 до 19 целыми числами от 100 до 119.

Я хочу использовать два потока, работающих одновременно, один поток помещает значения в массив из индекса 0 в индекс 9, другой поток из индекса 10 в индекс 19.

Когда я распечатываю элементы myArray , яожидайте увидеть это:

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

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

100 101 102 103 104 105 106 107 108 109 100 101 102 103 104 105 106 107 108 109

Я думаю, что проблема заключается вв моем методе addToArray () , где потоки обращаются к моей переменной aNumber .

Это когда нам нужно синхронизируется ?Если да, то как?

Пожалуйста, смотрите мой код:

Основной класс:

public class ThreadMain {
    SimpleThread first;
    SimpleThread second;

    public ThreadMain(String firstName, String secondName) {
        first = new SimpleThread(firstName);
        second = new SimpleThread(secondName);
    }

    public static void main(String[] args) {
        ThreadMain threadMain = new ThreadMain("FirstThread", "SecondThread");
        threadMain.startThreads();
        threadMain.waitForThreadsToFinish();
        threadMain.displayArrayElements();

    }

    private void startThreads() {
        first.start();
        second.start();
    }

    /**
     * main thread sleeps while the other threads are working.
     */
    private void waitForThreadsToFinish() {
        while (first.isAlive() || second.isAlive()) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void displayArrayElements() {
        for (int i = 0; i < 20; ++i) {
            int element = SimpleThread.getArrayElement(i);
            System.out.println(element);
        }
    }
}

Класс резьбы:

class SimpleThread extends Thread {

    private int startIndex;
    private int endIndex;
    private static int[] myArray = new int[20];
    private int aNumber = 100;

    public SimpleThread(String str) {
        super(str);
    }

    public void run() {

        if (getName().equals("FirstThread")) {
            startIndex = 0;
            endIndex = 10;
            addToArray();//store value of aNumber in myArray from index 0 to index 9.
        }
        if (getName().equals("SecondThread")) {
            startIndex = 10;
            endIndex = 20;
            addToArray();//store value of aNumber in myArray from index 10 to index 19.
        }
    }

    private void addToArray() {
        for (int i = startIndex; i < endIndex; ++i) {
            myArray[i] = aNumber;
            ++aNumber;
        }
    }

    public static int getArrayElement(int index) {
        return myArray[index];
    }
}

1 Ответ

0 голосов
/ 09 октября 2018

Ваша проблема заключается в том, что оба экземпляра SimpleThread присваивают значения, начинающиеся с начального значения 100, и идут оттуда.

Одним из способов достижения желаемого результата будет использование чего-либокак:

private void addToArray(int startIndex, int endIndex) {
    for (int i = startIndex; i < endIndex; ++i) {
        myArray[i] = aNumber + startIndex; // Change is here
        ++aNumber;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...