0

私は2行あります:

   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

印刷ステートメントの後で、出力でフラッシュ操作を試してください。

于 2012-06-23T21:06:27.980 に答える
0

@Oli Charlesworth が正しく、outputter.print()スレッドを起動する場合、そのコードを確認し、それが返されるのを待つ方法を見つける必要があります。

もう 1 つの可能性は、outputter.print()特別なことは何もしていませんが、2 つの異なるスレッドがこのコードを同時に呼び出しているということです。その場合、最も簡単な修正は、このコードを同期することです。たとえば、メソッド内にある場合:

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) が Process を返す場合、.waitFor() を使用して終了を待つことができます。しかし、あなたの質問に答えるには十分な情報ではありません。準備ができていれば、おそらくあなたが言う方法があります。汚いトリックをしたい場合は、使用してください Thread.currentThread().sleep(1000)

しかし、それは良い解決策ではありません

于 2012-06-23T21:05:07.893 に答える
0

コード全体を配置していない理由はわかりませんが、マルチスレッドの問題があります。適切なスレッドを「取得」して NotifyAll() を追加し、この通知を待って別のスレッドを実行させると、手を汚す可能性があります。

または、単に配置することもできます

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

print (...) メソッドの最後に。

元の質問に対する抽象的な回答が必要な場合はコメントしてください

于 2012-06-24T10:16:48.243 に答える