Я думаю, что Крис сказал, что PrintWriter является потокобезопасным, но два потока в одном потоке не являются значимо поточно-ориентированными. Поэтому используйте один.

у меня есть две темы.

Поток один управляет клиентскими подключениями. (Есть только один клиент и один сервер)
Я называю это моей серверной веткой.

Поток два управляет отправкой сообщений клиенту. Я называю это моей веткой обработчика сообщений.

Нить один ответственен, помимо прочего, периодически отправляя сердцебиение клиенту.

При программировании я исходил из того, что сокеты не безопасны для потоков, но буферы были безопасны, и пока я использовал отдельные буферы для потоков сервера и процессора, я был бы в порядке.

Я также сделал предположение, что «PrintWriter» был аналогом буфера сокетов в Java.

Под этими предположениями я написал эту функцию, чтобы послать сердцебиение:

public void sendHeartBeat(){
        logger.info("Sending a hearbeat!");
        PrintWriter printWriter=null;
        try {
            printWriter = new PrintWriter(clientSocket.getOutputStream());
        } catch (IOException e) {
            logger.info(e.toString());
        }
        if(printWriter!=null){
            printWriter.print("HEARTBEAT#");
            printWriter.flush();
        }
    }

Другой поток, «процессор», делает нечто похожее на то, что он делает:

printWriter=new PrintWriter(theServer.getClientSocket().getOutputStream());

Таким образом, я бы создавал новый «буфер» каждый раз, когда хотел отправить сердцебиение, и мои сообщения никогда не перезаписывались.

К сожалению, это не так. И я получаю сообщение, поступающее через канал, как это: dsgdsbHEARTBEAT # sdg

Это вызывает дамп ядра позже.

Вот мои вопросы:

1) Разъемы, очевидно, не являются поточно-ориентированными, но являются ли PrintWriters, которые я получаю из них, поточно-безопасными? Или это просто возвращает тот же PrintWriter?

2) Что аналогично буферу сокетов в Java? Как я должен думать об этой проблеме?

3) Как мне сделать так, чтобы эти потоки не записывали в один и тот же буфер на сокете?

Ответы на вопрос(2)

Ваш ответ на вопрос