java中的timertask是自己莫名其妙死掉了,还是永久阻塞了?
我在servlet里创建了一个timer,并在timer中定义了一个timertask,(2分钟执行一次timertask中的run方法)并且没有写任何中断timer的语句
出现了下面的问题(这个问题出现的几率相当小)
后台的日志:
打印了arr_xml_rq00 doSend()66666666 但是没有打印arr_xml_rq00 doSend()77777777,没有异常出现
对应的程序片段:
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-agent","Mozilla/4.0");
connection.setDoOutput(true);
//Read from the connection. Default is true.
connection.setDoInput(true);
//Set the post method.默认是get
connection.setRequestMethod("POST");
//Post 请求不能使用缓存
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(false);
log.info("arr_xml_rq00 doSend()4444444");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes(sendXmlLast.toString());
log.info("arr_xml_rq00 doSend()55555555");
out.flush();
out.close();
log.info("arr_xml_rq00 doSend()66666666");
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
String readLine = "";
sb = new StringBuffer();
while ((readLine = in.readLine()) != null) {
sb.append(readLine);
}
in.close();
log.info("arr_xml_rq00 doSend()77777777");
之后timertask再也没有执行过,(因为我还在timertask的run中log.info了别的信息,那些信息没有打印证明了这一点)
请问是线程死掉了,还是永久阻塞了.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
怎么把堆栈文件导出,从而看到线程状态,有什么工具,推荐一下
把堆栈文件导出来, 能看到线程状态, 也有很多分析工具帮你分析,可以检查线程是否锁死
感谢你的回答,但是你的回答太简短,实在是不明白什么意思
你先给connection setConnectTimeout和setReadTimeout 下 再看。
不好意思,我补充一下,你现在看到的这段代码,全部在一个try语句块里里,相应的catch也有些对应的打印异常语句,并且没有再往外抛,所以这个可以肯定如果有异常肯定就捕获并在log中打印了,没有打印就证明没有异常吧
技术和解决方案的选择很重要 一方面 Timer对调度的支持是基于绝对时间,而不是相对时间的,系统时间改变是较为铭敏感的;另一方面你这里不执行了应该是未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了,导致看到的日志没有了,看下源码就晓得了哈;ScheduledThreadPoolExecutor用这个替代timerTask来处理吧,如果问题解决了 那么点赞哈 午饭时间给你打这些字还是很恼火的