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.
We create a class that extends the java. This class overrides the run() method available in the Thread class. A thread begins its life inside run() method. We create an object of our new class and call start() method to start the execution of a thread. Start() invokes the run() method on the Thread object.
Java supports multithreading through Thread class. Java Thread allows us to create a lightweight process that executes some tasks. We can create multiple threads in our program and start them.
In the same multithreaded process in a shared-memory multiprocessor environment, each thread in the process can run concurrently on a separate processor, resulting in parallel execution, which is true simultaneous execution.
println uses the libuv event queue, which is not thread safe, even with locks, last time I tried.
Here might be some sample code to fix the problem:
while(iterator.hasNext())
{
    SelectionKey key = iterator.next();
    channel.receive(buffer);     // The buffer is a ByteBuffer.
    buffer.flip();
    byte[] bytes = new byte[buffer.limit()];  // copy buffer contents to an array
    buffer.get(bytes);
    // thread will convert byte array to String
    new Thread(new ThreadToPrintTheMessage(bytes)).start();
    buffer.clear();
    iterator.remove();
}
                        synchronized (System.out) {
    System.out.println(message);
    System.out.flush();
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With