I have a multi-threaded Java application that will output information about a message it receives to the console for debugging purposes. Each time the application receives a message, it will call a System.out.println(String)
on the message.
The problem that I am having is that if the application gets flooded with messages, System.out.println()
prints erroneous information (like old buffer information). This is leading me to wonder if there is a threading issue where multiple threads are calling the println
function at one time, and not properly flushing the buffer.
In my main program (thread), I have something to the effect of:
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();
}
In my thread, I have something to the effect of:
@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.
}
Is there a simple way for me to have multiple threads print out to the console at one time without the buffers containing old information?
Thanks
EDIT: updated the code in the main thread to be more representative of what my program is doing.
System.out.println
is synchronized so you shouldn't get "old" information. – Luminalprintln
method. – Ferrotypeprintln
andflush
. – Ferrotypebuffer
into theThreadToPrintTheMessage()
ctor (unless you make a copy inside the constructor yourself.) – Graduationprivate ByteBuffer
object declared, and the constructor does a:this.buffer = buffer
. I assumed that Java does pass by value and therefore makes a copy (unless this is wrong). – Ferrotype