色空大师 2024-09-05 15:10 采纳率: 40.9%
浏览 28

为什么线程中的异常不会打印异常信息

为什么线程中的异常不会打印异常信息

代码如下

package com.test.pool.service.impl;

import com.test.pool.service.TestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.ExecutorService;

@Service
@Slf4j
public class TestServiceImpl implements TestService {

    @Resource
    ExecutorService simpleExecutor;
    @Override
    public ResponseEntity sun() {
        simpleExecutor.submit(()->{
            log.info("thread start----");
            try {
                first();
                Thread.sleep(1000);
            }catch (Exception e){
                log.error("sleep error");
            }
            int i = 8/0;
            second();
            third();
        });
        return ResponseEntity.ok("success");
    }

    public void first(){
        log.info("first");
    }

    public void second(){
        log.info("second");
    }

    public void third(){
        log.info("third");
    }
}


线程池配置:

package com.test.pool.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration
public class ThreadConfig {

    @Qualifier("simpleExecutor")
    @Bean
    public ThreadPoolExecutor simpleExecutor() {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(16,
                16,
                10,
                TimeUnit.MINUTES,
                new SynchronousQueue<>(),
                new CustomizableThreadFactory("simple-pool-"),
                new ThreadPoolExecutor.AbortPolicy());
        threadPoolExecutor.allowCoreThreadTimeOut(true);
        return threadPoolExecutor;
    }
}


运行结果如下:

img


请求两次,除0异常没有打印,为什么?

展开全部

  • 写回答

2条回答 默认 最新

  • 编程巫师 全栈领域优质创作者 2024-09-06 07:21
    关注

    在Java中,如果你在一个子线程中抛出了一个未被捕获的异常,那么这个异常默认情况下不会影响到主线程的执行。这是因为子线程的异常默认是在子线程内部处理的,除非你显式地捕获并传播这个异常。

    public ResponseEntity sun() throws ExecutionException, InterruptedException {
            Future<?> future =simpleExecutor.submit(()->{
                log.info("thread start----");
                try {
                    first();
                    Thread.sleep(1000);
                }catch (Exception e){
                    log.error("sleep error");
                }
                int i = 8/0;
                second();
                third();
            });
            future.get();
            return ResponseEntity.ok("success");
        }
    
    
    
    评论
  • kyle凯尔 2024-09-06 08:43
    关注

    simpleExecutor.submit() 提交的Runnable先包装成Callable,然后又被包装成FutureTask,
    FutureTask在run()的时候把 Callable的run()方法【进行异常捕获】,并设置到了FutureTask的outcome中,进行返回。

    img

    评论
编辑
预览

报告相同问题?

问题事件

  • 创建了问题 9月5日

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部