我有以下代码:
class Test
{
public static void main (String[] args) throws Exception
{
long start = System.currentTimeMillis();
long end = start + 1000; // 1000 ms/sec
while (System.currentTimeMillis() < end) {
System.out.println("hello world!");
}
}
}
给出了一些我正在添加结尾部分的输出:
............
............
hello world!
hello world!
hello world!
hello world!
hello world!
hello world!
hello world!
hel
根据我对此输出的理解,循环终止于System.out.println("hello world!")
语句的中间。
我没想到,因为我认为当while-loop
成为condition
False
会终止
我假设一定发生了,因为condition
在False
打印System.out.println()
后变为"hel"
,但是谁正在检查condition
在一个陈述的中间,我认为在下一次迭代开始时会检查条件吗?
我想了解它是如何以及为何发生的?
答案 0 :(得分:1)
System.out
是PrintStream
的实例,而steams(在某些情况下)基本上充当进程之间的I / O桥。为了确保您对println
调用流的所有内容实际上都已写入您的控制台,您需要flush
该流。看起来System.out
通常是 JVM和控制台之间的连接(无论可能是什么),你的JVM程序很可能在你的流实际>之前终止em>被刷新到控制台 - 因此你正在观察的行为。
所以不在println中途检查一个条件(因为这不会发生(在一个线程中)),但是你要求数据到被发送到流但在该流能够刷新数据(到控制台)之前JVM已经终止,所以它只是停止执行你要求它做的事情。当JVM卸载时(作为一个进程)它只会这样做 - 卸载并停止存在,并停止做它正在做的任何事情。
有关详细信息,请参阅此文章:http://tutorials.jenkov.com/java-io/system-in-out-error.html具体来说:
请记住,您应确保在JVM关闭之前刷新System.out并关闭文件,以确保写入System.out的所有数据实际上都已刷新到该文件。
虽然对于“文件”,请阅读程序的“控制台”。
所以为了确保刷新你的程序(可能,我还没有测试过,所以“理论上编程”在这里)变成:
class Test
{
public static void main (String[] args) throws Exception
{
try {
long start = System.currentTimeMillis();
long end = start + 1000; // 1000 ms/sec
while (System.currentTimeMillis() < end) {
System.out.println("hello world!");
}
} finally {
System.out.flush();
}
}
}