java中的timertask是自己莫名其妙死掉了,还是永久阻塞了?

发布于 2021-11-20 18:02:12 字数 2055 浏览 925 评论 6

我在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

爱你是孤单的心事 2021-11-25 19:39:45

怎么把堆栈文件导出,从而看到线程状态,有什么工具,推荐一下

兮颜 2021-11-25 19:33:08

把堆栈文件导出来, 能看到线程状态, 也有很多分析工具帮你分析,可以检查线程是否锁死

成熟稳重的好男人 2021-11-25 18:46:58

感谢你的回答,但是你的回答太简短,实在是不明白什么意思

已下线请稍等 2021-11-25 09:39:58

你先给connection setConnectTimeout和setReadTimeout 下 再看。

酒几许 2021-11-25 06:04:22

不好意思,我补充一下,你现在看到的这段代码,全部在一个try语句块里里,相应的catch也有些对应的打印异常语句,并且没有再往外抛,所以这个可以肯定如果有异常肯定就捕获并在log中打印了,没有打印就证明没有异常吧

谁的新欢旧爱 2021-11-23 08:06:48

技术和解决方案的选择很重要 一方面 Timer对调度的支持是基于绝对时间,而不是相对时间的,系统时间改变是较为铭敏感的;另一方面你这里不执行了应该是未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了,导致看到的日志没有了,看下源码就晓得了哈;ScheduledThreadPoolExecutor用这个替代timerTask来处理吧,如果问题解决了 那么点赞哈 午饭时间给你打这些字还是很恼火的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文