Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jackson编写JSON会阻塞我的TimerTask_Java_Json_Timer_Jackson_Timertask - Fatal编程技术网

Java 使用Jackson编写JSON会阻塞我的TimerTask

Java 使用Jackson编写JSON会阻塞我的TimerTask,java,json,timer,jackson,timertask,Java,Json,Timer,Jackson,Timertask,我想每5秒钟写一些JSON。我正在使用Jackson编写JSON,但它似乎阻止了我的TimerTask。如果我不写JSON,TimerTask每5秒运行一次,但是当我尝试写JSON时,它被阻塞,只运行一次。我怎样才能解决这个问题 public class MyTimerTask extends TimerTask { public static void main(String[] args) { Timer timer = new Timer();

我想每5秒钟写一些JSON。我正在使用Jackson编写JSON,但它似乎阻止了我的TimerTask。如果我不写JSON,TimerTask每5秒运行一次,但是当我尝试写JSON时,它被阻塞,只运行一次。我怎样才能解决这个问题

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)
“Timer-0”prio=6 tid=0x02488000 nid=0x10ec在Object.wait()中[0x04a6f000]
java.lang.Thread.State:定时等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.util.TaskQueue)
位于java.util.TimerThread.mainLoop(未知源)
-锁定(java.util.TaskQueue)
在java.util.TimerThread.run处(未知源)

它是被阻止的,还是只是抛出了一个你没有捕获到的异常,从而有效地取消了你的任务

作为一个方面,“printStackTrace()”几乎从来都不是一种有用的异常处理形式。要么不捕获异常,要么有意义地记录它。仅仅调用“printStackTrace()”就要求隐藏bug


如果任务确实被阻止,那么下一步就是获取挂起程序的堆栈转储。这将向您显示导致代码阻塞的原因。

问题在于您使用System.out,而不是Jackson。

我使用
异常更新了我的代码,以捕获所有代码。更新了我的答案以指示下一步,即获取堆栈转储。我添加了一个“堆栈转储”,但我并不真正理解它。不管怎样,我希望它能有所帮助。“Timer-0”线程是计时器的工作线程。它当前正在等待下一次执行任务。因此,根据堆栈转储,您的计时器没有被阻塞,但似乎工作正常。可能您等待的时间不够长?请附加一个调试器并逐步执行任务。首先序列化为字符串,然后打印结果(可能带有尾随换行符)