0

我有两行:

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

4

5 回答 5

1

大概outputter.print会触发一个线程(或者可能是多个线程),该线程/正在异步写入System.out(或您的文本输出要去的任何地方)。

解决这个问题的方法是等到这些线程完成所有工作。由于您尚未向我们展示该方法的代码,因此我无法真正帮助您!

于 2012-06-23T20:54:57.260 回答
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.");
}

如果此代码被称为技能次,则存在性能问题。但是对于不频繁的呼叫,这是安全且简单的。

于 2012-06-23T21:04:42.293 回答
0

outputter.print 触发启动进程或线程。如果 outputter.print(x) 返回一个进程,您可以使用 .waitFor() 等待结束。但它没有足够的信息来回答你的问题。如果准备好了,也许有一种方法可以告诉您。如果你想做一个肮脏的把戏,使用 Thread.currentThread().sleep(1000)

但这不是一个好的解决方案

于 2012-06-23T21:05:07.893 回答
0

在您的打印语句之后尝试对输出器执行刷新操作。

于 2012-06-23T21:06:27.980 回答
0

有一个多线程问题,虽然我不确定为什么你没有放置你的整个代码。您可以通过“获取”适当的线程并添加 NotifyAll() 然后通过等待此通知来执行另一个线程来弄脏您的手。

或者你可以把你的

LOG.info("Total word count is completed.");

在您的 print (...) 方法结束时。

如果您想为您的原始问题“如何阻止语句执行直到 previuos 在 java 中完成?”,请发表评论。

于 2012-06-24T10:16:48.243 回答