Java 使用Jackson编写JSON会阻塞我的TimerTask
我想每5秒钟写一些JSON。我正在使用Jackson编写JSON,但它似乎阻止了我的TimerTask。如果我不写JSON,TimerTask每5秒运行一次,但是当我尝试写JSON时,它被阻塞,只运行一次。我怎样才能解决这个问题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();
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”线程是计时器的工作线程。它当前正在等待下一次执行任务。因此,根据堆栈转储,您的计时器没有被阻塞,但似乎工作正常。可能您等待的时间不够长?请附加一个调试器并逐步执行任务。首先序列化为字符串,然后打印结果(可能带有尾随换行符)