如何阻止执行语句直到上一次在java中完成?

时间:2012-06-23 20:53:02

标签: java multithreading logging

我有两行:

   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返回一个集合,其中许多线程更新此集合。它是同步的,我将返回它的副本。

5 个答案:

答案 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完成?”