Использование многопоточности для безопасного чтения из массива, в который выполняется запись - PullRequest
0 голосов
/ 15 октября 2018

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

Однако, если результат чтения равен нулю (т. Е. Индекс чтенияперед записью индекса), я хочу, чтобы он подождал, а затем снова получил доступ к тому же индексу.

Я пытался использовать синхронизированные операторы, а также read () и notify () следующим образом.

int n = Integer.parseInt(br.readLine());
String[] lines = new String[n];

Thread t1 = new Thread(() -> {
    try {
        for (int i = 0; i < n; i++) {
            synchronized(lines) {
                lines[i] = br.readLine();
                    lines.notify();
            }
        }
    } catch (IOException e) {
        return;
    }
});

t1.start();

Thread t2 = new Thread(() -> {
    try {
        int i = 0;
        while (i < n) {
            String get = lines[i];

            if (get == null) {
                synchronized (lines) {
                    lines.wait();
                }
                continue;
            }

            add(representString(lines[i]), hmap);

            i++;
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
        return;
    }
});

t2.start();

Проблема в том, что у меня есть набор тестов, которые иногда зависают, но иногда работают.(У меня нет опыта работы с многопоточностью, я просто учусь на онлайн-уроках, чтобы быстрее выполнять задания без параллелизма.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...