LINUX.ORG.RU

(Java) Корректное закрытие фонового потока с сокетом?


0

0

Ситуация: есть фоновый поток, который в цикле читает сокет (в блокирующем режиме), а по приходе данных рассылает события.

Проблема в том, как этот поток корректно завершить при выходе из приложения. Сейчас у меня функция, вызываемая при закрытии программы, просто закрывает сокет, что приводит к падению фонового потока по SocketException. Но это нехорошо, потому что сокет - разделяемая переменная, так?

Псевдокод такой:

void start()
{
    sock = createSocket();
    listeners = createActionListenerArray();
    
    startThread();
}

void runThread()
{
    try
    {
        while(!sock.isClosed())
        {
            data = sock.receive();
            sendEventToAll(listeners, data);
        }
    }
    catch(SocketException)
    {
        // сокет закрылся
    }
}

void stop()
{
    sock.close();
}
★★★

> Но это нехорошо, потому что сокет - разделяемая переменная, так?

Не, для блокирующих сокетов это распространенная практика. Для неблокирующих -- можно wait(delay) воткнуть и пробуждать please_die + notify()

swizard
()
Ответ на: комментарий от Kpoxman

Не пойдёт. Он работает только в случаях, когда поток находится в состоянии wait, sleep или join. Блокировка на сокете к этим состояниям не относится.

Sikon ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.