我有一个多线程Java应用程序,该应用程序会将有关它收到的消息的信息输出到控制台以进行调试。每次应用程序收到消息时,它将System.out.println(String)
在消息上调用。
我遇到的问题是,如果应用程序被消息淹没,则会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.
}
是否有一种简单的方法可以一次将多个线程输出到控制台,而缓冲区中不包含旧信息呢?
谢谢
编辑:更新了主线程中的代码以更代表我的程序在做什么。
以下可能是一些示例代码来解决此问题:
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();
}
问题内容: 我在Oracle Java教程中遇到了这个示例,该示例描述了多线程场景中的死锁。 因此,在此示例中,我在第17行和第18行进行了以下更改。 完成这些更改后,程序将成功终止,而不会导致死锁,并在输出后进行打印 所以我的问题是-为什么会这样表现?println语句如何防止死锁? 问题答案: 无论您使用还是,都没有什么区别:它们基本上是在做同一件事。 如果在和的开始之间开始执行,则在此处发生
问题内容: 如果多个线程在不同步的情况下调用System.out.println(String),输出是否可以交错?还是每行的写入都是原子的?该API只字不提同步的,所以这似乎是可能的,或者是由交错缓冲和/或虚拟机存储器模型等防止输出? 编辑: 例如,如果每个线程包含: 保证输出是: 或者可能是: 问题答案: 由于API文档没有提及System.out对象的线程安全性,因此该PrintStream
问题内容: 有人可以帮助我了解什么是Java 以及何时使用它吗? 对于该程序的工作方式,我没有一个很清楚的想法。据我了解,所有三个线程同时启动,每个线程将在3000ms之后调用CountDownLatch。因此,递减计数将逐一递减。锁存器变为零后,程序将打印“ Completed”。也许我的理解方式不正确。 // ------------------------------------------
问题内容: 我正在编写一个使用大量CPU的Java程序,因为它的工作性质。但是,许多程序可以并行运行,并且我使程序成为多线程的。当我运行它时,似乎只使用一个CPU直到需要更多的CPU,然后再使用另一个CPU- 我可以用Java强制其他操作在不同的内核/ CPU上运行吗? 问题答案: 当我运行它时,它似乎只使用一个CPU直到需要更多的CPU,然后再使用另一个CPU-我可以用Java强制其他操作以在不
问题内容: 首先感到遗憾的是,如果这是一个非常基本的问题,我建议我仍然是代码猴子。我在一次采访中被要求阐明System.out.println(); 我解释了以下方式 我已经解释说System.out是有效的,因为这是我们在Java中访问静态变量的方式,而out是PrintStream的对象,因此我们可以访问其方法。 他要求我模拟一个类似的程序,我跟踪了它,但是它没有用,因为System.out返
问题内容: 假设我要打印5行。哪种方法最好(提高性能和可读性)。 要么 是偏好问题还是一个优于另一个问题。使用第二种方法似乎可以节省很多时间。 问题答案: 有一个 功能性 两者之间的区别。第一个版本使用平台的首选行分隔符输出换行符。第二个版本输出换行符,这在Windows或Mac OS上可能是不合适的。 这比任何实际或想象的性能优势都重要。 关于性能,以及为什么每个人似乎都说“已经足够”了。 两种