spring定时任务中的奇怪的Java多线程问题

发布于 2022-09-13 00:47:28 字数 1431 浏览 26 评论 0

场景 : 在spring中写一个定时任务,定期从一个DelayQueue对象中获取数据并执行。spring的定时任务的线程采用的是一个大小为8的线程池。

具体代码如下:

public class Timer{
   private final static DelayQueue<String> delayedTasks = new DelayQueue<String>(); 
   
   @Async
   @Scheduled(fixedRate=1000*10)
   public void consume(){
      log.info("开始获取");
      String payment = null;
      try{
         FutureTask<String> future = new FutureTask<String>(new AcquireDelayedTask());
         Thread takeTh = new Thread(future,"my_thread");
         takeTh.start();
         try{
            payment = future.get(1,TimeUnit.SECONDS);
         } catch(TimeoutException e){
            log.info("等待超时,没有获取到");
            return;
         }
      } catch(RuntimeException re){
         return;
      }
   }

   class AcquireDelayedTask implements Callable<String> {
      @Override
      public String call() throws Exception{
         String payment = Timer.delayedTasks.take();
         return payment;
      }
   }
}

问题现象描述
一开始运行时,挺正常。每隔10s执行一次任务,并且代码中的两个log都能够打印出来。(因为测试时,DelayQueue中一直都是空的,所以肯定会打印超时的那条日志。)
就这样正常运行几个小时后,问题出现了:spring定时任务能正常按照10秒的间隔运行,但只会打印"开始获取"这个条日志,另外一条不再打印了。
debug跟踪时发现,代码跑到 takeTh.start(); 这一行就跟踪不下去了(不是多线程无法debug的那种现象),因为public String call() 这个方法也无法debug,好像线程start了,但一直没有被调度似的。问题出现前,debug都是可以的。

求解,是哪里出问题了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(2

难理解 2022-09-20 00:47:28
         } catch(TimeoutException e){
            log.info("等待超时,没有获取到");
            return;
         }
      } catch(RuntimeException re){
         return;
      }

先把异常都好好打出来吧
目测一直在创建线程,达到了某个上限

凹づ凸ル 2022-09-20 00:47:28

最佳实践不是加上finally块,在里面执行takeTh.interrupt(),而是处理InterruptedException,

    catch (InterruptedException e) {
        Thread.currentThread().interrupt();  // set interrupt flag
  
    }

参考:中断异常

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