Heloise_yangyuchang 2022-12-31 16:53 采纳率: 0%
浏览 30

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条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2022-12-31 19:39
    关注

    如果线程停止了工作,可能是因为以下原因之一:


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

    评论

报告相同问题?

问题事件

  • 创建了问题 12月31日