逻辑是这样, springboot项目启动时开启20个线程 用while (true)从一个LinkedBlockingQueue里面取数据进行逻辑处理.
代码如下:@Component
@Order(value = 2)
public class FilterRunner implements CommandLineRunner { @Override
    public void run(String... args) throws Exception {
List<Thread> threads = new ArrayList<Thread>();
     logger.info("执行线程开始运行.....");
     for (int i = 0; i <20; i++) {
FilterThread rft = new FilterThread();
     Thread thread = new Thread(rft);
thread.setName("filter-thread-"+i);
thread.start();
threads.add(thread);
}
    
    }
    
}下面是线程代码
@Component
public class FilterThread extends RuleStep implements Runnable{ @Override
public void run() {
logger.info("开始执行过滤器线程");
while (true) {
try {

DataCommonDto data = queue.take();
logger.info("获取的待过滤数据:"+JSONObject.toJSONString(data));

/*下面是业务逻辑处理*/
.....

try {
Thread.sleep(200);
} catch (InterruptedException e) {
logger.error("过滤器线程休眠失败",e);
}
} catch (Exception e) {
logger.error("过滤器线程处理发生异常",e);
}
}

}}只要有大量并发请求往queue里面插入数据. 用jstack检查, 发现上面创建的20个线程就会有一部分结束运行. 多次之后,20个线程就全部结束了. 任务也就不跑了. 理论上并发往queue插入数据和取数据的执行线程应该没关系才对...
看后台没有任何异常日志,包括在循环里面也没有catch到任何异常. 线程就这么结束了.....请问有大佬知道这是为什么吗, 我现在解决方法是如果发现活动线程数少于10,就再new一些线程去跑这个任务...jdk版本是1.8.0_31

解决方案 »

  1.   

    是不是对你的父类rulestep做了拦截 AOP处理,在AOP里面做了一些处理逻辑,出现异常也没打印相关错误,导致啥也没有。看你这个父类应该是规则引擎之类的东西,应该有什么AOP处理,或者监听器之类的
      

  2.   

    老铁很6, 的确是规则引擎方面的东西, 父类ruleStep是我自己定义的抽象类,但没有加上其他注解或者拦截, 它里面的方法是用来往mongoDB记录业务日志的. 不过你说的有道理, 我打算去掉这个父类再试一试.
      

  3.   

    老铁很6, 的确是规则引擎方面的东西, 父类ruleStep是我自己定义的抽象类,但没有加上其他注解或者拦截, 它里面的方法是用来往mongoDB记录业务日志的. 不过你说的有道理, 我打算去掉这个父类再试一试.哈哈哈,好呢,关注后续~