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