Мне удалось настроить синхронизированный запуск для моего приложения, и я не выполняю завершение работы.
Я использую 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
блокировка? - Как мне обойти блокировку?