逻辑是这样, 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
代码如下:@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
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货