Я пытаюсь читать входные данные из сокета построчно в нескольких потоках. Как я могу прервать readLine ()
, чтобы я мог изящно остановить поток, который он блокирует?
EDIT (bounty) : это можно сделать без закрытия сокета?
Закройте гнездо на прерывающей резьбе. Это приведет к возникновению исключения в прерванном потоке.
Для получения дополнительной информации об этом и других проблемах параллелизма я настоятельно рекомендую книгу Брайана Гетца "Java Concurrency in Practice".
вы можете создать класс Timer вокруг блока read().
вам нужно установить тайм-аут для вашего таймера.
По тайм-ауту просто прервите свою ветку.
Я думаю, что вам, возможно, придется использовать что-то другое, кроме readLine()
. Вы можете использовать read()
и на каждой итерации цикла проверять, был ли поток прерван, и выйти из цикла, если это так.
BufferedReader reader = //...
int c;
while ((c = reader.read()) != -1){
if (Thread.isInterrupted()){
break;
}
if (c == '\n'){
//newline
}
//...
}