Java резьба останавливается после отключения - PullRequest
0 голосов
/ 13 февраля 2020

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

Я использую CountDownLatch, чтобы дождаться закрытия всех моих потоков. Каждый поток повторяется до тех пор, пока для логического (volatile) логического значения running не будет установлено значение false.

Вот пример (Caught) Runnable, выполняемый в потоке

System.out.println("STARTING");
startupLatch.countDown();
final BufferedReader reader = getReader();
String line;
System.out.println("STARTED");
while (running) {
    System.out.println("WAITING FOR CLOSE");
    while ((line = reader.readLine()) != null) {
        System.out.println("WAITING FOR NO MORE LINES");
        System.out.println(line);
    }
}
shutdownLatch.countDown();
System.out.println("EXITED READING THREAD: EXITS LEFT: " + shutdownLatch.getCount());

Первоначально я думал, что изменение флага выполнения может не распространяться на поток, но оказывается, что поток фактически блокируется где-то после reader.readLine() - таким образом, следующая итерация while l oop не может быть достигнуто, где shutdownLatch будет уменьшено.

Мой вывод консоли:

STARTING

STARTED

WAITING ДЛЯ ЗАКРЫТИЯ

ВЫКЛЮЧЕНИЕ

SHUTTING DOWN исходят из моего close (выключения) метода.

Этот l oop был while(true) l oop до того, как я решил осуществить упорядоченное отключение; таким образом, блокирующий вызов readline будет в порядке - на самом деле предпочтительнее, чем выделение при l oop итерациях - потому что это происходит в другом потоке. Однако, похоже, теперь мне нужно , чтобы вращаться во время цикла, чтобы выяснить, когда происходит отключение.

  • Является ли проблема readline здесь? если так:
    • Предполагается ли readline блокировка?
    • Как мне обойти блокировку?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Вы можете иметь не блокирующий ввод / вывод только на сокетах. Чтобы прервать работу диска или любой другой ввод-вывод Reader, поток Reader должен быть прерван. В большинстве случаев вы получите InterruptedIOException , что сломает l oop.

0 голосов
/ 13 февраля 2020

Используйте reader.ready(), чтобы проверить, заблокирует ли следующий вызов readLine() текущий поток

...