Play框架控制台中System.out.println输出顺序混乱

8

我正在使用Play 2.4和Activator 1.3.7,并且注意到System.out.println在浏览器控制台中并不总是按顺序打印。虽然这种情况很少见,但今天我亲眼目睹了。以下是打印语句的顺序:

    System.out.println("width : " + mobileCrawl.getWidth());
    System.out.println("window width : " + mobileCrawl.getWindowWidth());
    System.out.println("scroll width : " + mobileCrawl.getScrollWidth());
    System.out.println("seed : " + mobileCrawl.getSeed());
    System.out.println("resolved seed : " + mobileCrawl.getResolvedSeed());
    System.out.println("crawl date : " + mobileCrawl.getCrawlDate());
    System.out.println("400 : " + mobileCrawl.isDetected400());
    System.out.println("401 : " + mobileCrawl.isDetected401());
    System.out.println("402 : " + mobileCrawl.isDetected402());
    System.out.println("403 : " + mobileCrawl.isDetected403());
    System.out.println("404 : " + mobileCrawl.isDetected404());
    System.out.println("500 : " + mobileCrawl.isDetected500());
    System.out.println("501 : " + mobileCrawl.isDetected501());
    System.out.println("502 : " + mobileCrawl.isDetected502());
    System.out.println("503 : " + mobileCrawl.isDetected503());

以下是它打印的顺序(URL已更改):

width : 980
window width : 980
scroll width : 980
seed : http://google.com/
resolved seed : https://www.google.com/
400 : false
401 : false
402 : false
crawl date : Fri Dec 18 11:18:09 MST 2015
403 : false
500 : false
404 : true
501 : false
502 : false
503 : false

它打印的日期比应该打印的要晚三行。这些都是来自同一线程的打印语句,都来自System.out,没有来自System.err,因此不应有任何交错。
这些为什么会打印出顺序?我以为System.out会保证顺序。

当你说“在浏览器控制台中”时,你的意思是你可以在Activator UI控制台(即你的浏览器中)获得此输出吗?如果是这样,这也会发生在控制台(终端)中吗? - Salem
@Salem 是的,这是在 Activator UI 控制台中的输出。我不知道是否还有其他可用于检查的控制台。我不能轻易地在 Activator 之外的环境中运行此代码。 - Indigenuity
当您在单线程下运行时,这种情况不应该发生。有可能这个输出来自多个线程吗? - Max
它肯定都来自同一个线程。 - Indigenuity
1个回答

0

正如Max所评论的,如果您正在运行单线程,则不应该发生这种情况。也许尝试同步您的调用,看看是否有什么东西在您不知情的情况下干扰了您的线程?:

public synchronized void println(String s) { System.out.println(s); }

这些打印语句都在同一个方法中。没有办法让一个方法一半在一个线程上执行,一半在另一个线程上执行。 - Indigenuity
PrintStream.println() 已经包含同步,因此再加一层同步将不能确保改变行为。 - Ole V.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接