使用System.currentTimeMillis()

时间:2015-09-23 19:46:47

标签: java loops

我有以下代码:

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会终止

我假设一定发生了,因为conditionFalse打印System.out.println()后变为"hel",但是谁正在检查condition在一个陈述的中间,我认为在下一次迭代开始时会检查条件吗?

我想了解它是如何以及为何发生的?

1 个答案:

答案 0 :(得分:1)

System.outPrintStream的实例,而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();
        }
    }
}