只要有大量并发请求往queue里面插入数据. 出现线程不消费的情况. 任务也就不跑了. 理论上并发往queue插入数据和取数据的执行线程应该没关系才对。
看后台没有任何异常日志,包括在循环里面也没有catch到任何异常. 线程就这么结束了!请问有同学知道这是为什么吗?
代码如下:
@Component
public class BuszRunner 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);
}
}
}
public class FilterThread 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);
}
}
}
}
如果线程停止了工作,可能是因为以下原因之一:
1.在代码中没有处理到的异常导致线程意外终止。在这种情况下,可以在线程的 run() 方法中使用类似下面的代码来捕获所有未处理的异常:
try {
// 线程代码
} catch (Exception e) {
logger.error("线程处理发生异常", e);
}
2.可能存在调用了线程的 interrupt() 方法,导致线程意外终止。在这种情况下,可以在线程的 run() 方法中使用类似下面的代码来处理线程的中断:
try {
// 线程代码
} catch (InterruptedException e) {
logger.error("线程被中断", e);
Thread.currentThread().interrupt(); // 保留中断状态
}
3.可能存在调用了线程的 stop() 方法,导致线程意外终止。这是不推荐使用的方法,因为它可能导致线程间的资源竞争问题。
4.可能存在外部的因素,例如 JVM 的内存不足或者系统意外停机等,导致线程意外终止