2

5秒ごとにJSONを書きたいと思います。ジャクソンを使用してJSONを記述していますが、TimerTaskがブロックされているようです。JSONを作成しない場合、TimerTaskは5秒ごとに実行されますが、JSONを作成しようとすると、ブロックされて1回だけ実行されます。どうすればこれを修正できますか?

public class MyTimerTask extends TimerTask {

    public static void main(String[] args) {

        Timer timer = new Timer();

        // execute MyTimerTask every 5th second
        timer.scheduleAtFixedRate(new MyTimerTask(), 1000L, 5 * 1000L);
    }

    @Override
    public void run() {
        System.out.println("timertask");

        // Write JSON to System.out
        ObjectMapper mapper = new ObjectMapper();
        try {
            mapper.writeValue(System.out, "Hello");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}

タイマースレッドのスタックダンプは次のとおりです。

"Timer-0" prio=6 tid=0x02488000 nid=0x10ec in Object.wait() [0x04a6f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x24577fa8> (a java.util.TaskQueue)
        at java.util.TimerThread.mainLoop(Unknown Source)
        - locked <0x24577fa8> (a java.util.TaskQueue)
        at java.util.TimerThread.run(Unknown Source)
4

2 に答える 2

1

問題は、Jacksonではなく、System.outの使用にあります。

于 2011-05-04T18:26:32.183 に答える
0

それはブロックされているのでしょうか、それともキャッチしていない例外をスローしているだけで、タスクを効果的にキャンセルしているのでしょうか。

「printStackTrace()」ではない側面として、例外処理の有用な形式になることはほとんどありません。例外をキャッチしないか、意味のあるログに記録します。「printStackTrace()」を呼び出すだけで、バグを隠すことができます。

タスクが実際にブロックされている場合、次のステップは、ハングしたプログラムのスタックダンプを取得することです。これにより、コードがブロックされる原因がわかります。

于 2011-05-01T21:09:28.530 に答える