我有两行:
display.print(x); // outputs a collection contenet
LOG.info("Total word count is completed.");
第一行中的方法调用从集合中打印一堆数据。但是当它的打印和完成日志语句之前被执行。所以输出看起来像:
...
a : 6
as : 6
23/06/2012 09:38:01 م sample.testing
INFO: Processing... 0 thread(s) has/have finished
book : 6
had : 6
...
但只能在打印完所有数据后打印日志。为什么会这样?以及它如何解决?
这是打印方法:
public void print(Map<String, Integer> map)
{
for (Map.Entry<String, Integer> current : map.entrySet())
{
System.out.println(String.format("%s : %d", current.getKey(), current.getValue()));
}
System.out.println();
}
编辑2:
我将 ThreadClass.getCol()
传递给print方法。 ThreadClass.getCol()
从ThreadClass返回一个集合,其中许多线程更新此集合。它是同步的,我将返回它的副本。
答案 0 :(得分:1)
大概outputter.print
会触发一个线程(或者多个线程),这是/
异步写入System.out
(或文本输出的任何地方)。
解决这个问题的方法是等到这些线程完成所有工作。由于您没有向我们展示该方法的代码,我无法真正帮助您!
答案 1 :(得分:0)
如果@Oli Charlesworth是正确的,并且outputter.print()
触发了一个线程,我们将需要查看该代码并找出如何等待它返回。
另一种可能性是outputter.print()
没有做任何花哨的事情,但是两个不同的线程一次调用这个代码。在这种情况下,最简单的解决方法是同步此代码。例如,如果它在一个方法中:
public **synchronized** void outputterPrint() {
outputter.print(x); // outputs a collection contenet
// you might want to add some sort of flush here
outputter.flush();
LOG.info("Total word count is completed.");
}
如果此代码被称为技能时间,则会出现性能问题。但对于不频繁的通话,这是安全和简单的。
答案 2 :(得分:0)
outputter.print fires启动一个porcess或一个线程。如果outputter.print(x)返回一个Process,则可以使用.waitFor()等待结束。但它没有足够的信息来回答你的问题。也许这是一种方法,你告诉它,如果它准备好了。如果你想做一个肮脏的把戏,请使用
Thread.currentThread().sleep(1000)
但它不是一个好的解决方案
答案 3 :(得分:0)
在print语句后尝试在outputter上执行刷新操作。
答案 4 :(得分:0)
虽然我无法确定为什么导致您没有放置整个代码,但存在多线程问题。您可以通过“获取”相应的线程并添加NotifyAll()然后通过等待此通知导致另一个线程执行来弄清楚。
或您可以放置
LOG.info("Total word count is completed.");
在print(...)方法的最后。
评论如果你想要一个原始问题的抽象答案“如何阻止一个语句执行,直到previuos在java完成?”