У меня есть многопоточное Java-приложение, которое будет выводить информацию о полученном им сообщении на консоль для целей отладки. Каждый раз, когда приложение получает сообщение, оно вызывает сообщение System.out.println(String)
.Несколько потоков, использующих System.out.println в Java
Проблема, с которой я столкнулся, заключается в том, что если приложение заливается сообщениями, System.out.println()
печатает ошибочную информацию (например, информацию старого буфера). Это заставляет меня задаться вопросом, есть ли проблема с потоками, когда несколько потоков одновременно вызывают функцию println
, а не правильно очищая буфер.
В моей основной программе (нить), у меня есть что-то эффект:
while(iterator.hasNext())
{
SelectionKey key = iterator.next();
channel.receive(buffer); // The buffer is a ByteBuffer.
buffer.flip();
new Thread(new ThreadToPrintTheMessage(buffer)).start();
buffer.clear();
iterator.remove();
}
В моей теме, у меня есть что-то эффект:
@Override
public void run()
{
System.out.println(message);
System.out.flush(); // I have better results with this. But, it doesn't
// fully resolve the issue.
}
Есть ли простой Кстати, для меня есть возможность одновременного вывода нескольких потоков на консоль без буферов, содержащих старую информацию?
Благодаря
EDIT: обновленный код в основном потоке, чтобы быть более представительным, что делает моя программа.
Можете ли вы показать часть «старой информации о буфере». 'System.out.println' синхронизируется, поэтому вы не должны получать« старую »информацию. – Gray
несколько потоков выходят на консоль за один раз? вы имеете в виду каждую нить за раз? – kosa
Например, если я получаю XML-сообщения, у вас будет что-то вроде:>/tag> – Phanto