while (true)的线程异常结束

只要有大量并发请求往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);

    }
}

}

@Component

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 的内存不足或者系统意外停机等,导致线程意外终止