线程池经典问题-任务异常处理

大家好,我是小趴菜,关于线程池我们都听过,也可能用过,也有了解过底层源码实现的,但是今天不研究它的实现原理,我们来看一下,提交到线程池的任务如果有异常了,会有什么问题

案例实现

首先我们定义一个线程池,

js 复制代码
private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 2, 10,
        TimeUnit.SECONDS, new ArrayBlockingQueue<>(1),
        new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                System.out.println("创建了线程===============================");
                t.setName("xpc-------------");
                return t;
            }
        });

然后定义一个任务的实现,让这个任务会抛出异常

js 复制代码
static class Task implements Runnable{

    @Override
    public void run() {
        
        int i = 1/0;

    }
}

定义一个main方法测试

js 复制代码
    public static void main(String[] args) throws Exception{

        for(int i = 0 ; i < 500000; i ++){
            threadPool.execute(new Task());
            Thread.sleep(100);
        }
        threadPool.shutdown();
    }

你会发现,如果整个任务有异常,你会发现会不断的创建线程

我们使用线程池的原因就是因为线程池可以复用线程,来解决不断创建线程,然后销毁线程的消耗

因为整个线程执行过程中出现异常,整个线程就中止了,所以下一个任务进来以后就会重新创建一个线程来执行整个任务

创建线程,销毁线程都是需要消耗资源的,所以必然会对服务器造成一定的压力

解决办法

把我们的任务类修改一下,用try{}catch(){}把我们的业务代码包裹起来

js 复制代码
static class Task implements Runnable{

    @Override
    public void run() {
        try{
            int i = 1/0;
        }catch (Exception e) {
            //在这里处理异常,比如业务补偿等,或者打印日志,等待人工处理
            System.out.println("任务执行异常了");
            return;
        }
    }
}

main方法

js 复制代码
    public static void main(String[] args) throws Exception{

        for(int i = 0 ; i < 500000; i ++){
            threadPool.execute(new Task());
        }
        threadPool.shutdown();
    }

你可以发现,就创建了两个线程,因为我们线程池设置的最大线程数就是两个,就避免了不断的创建线程整个问题

相关推荐
oradh8 分钟前
Oracle DG主备架构的基本维护操作总结
数据库·oracle·架构·dg主备架构的基本维护操作总结
达达尼昂14 分钟前
编码智能体中的模型选择与执行深度
人工智能·后端·程序员
用户67570498850216 分钟前
写了 6 年 Go ,我终于领悟到了泛型的真正威力!
后端·go
东方佑20 分钟前
FRSMASH v3.7:当门控机制成为长上下文的枷锁——一个极简修复背后的架构洞见
人工智能·架构
KaifuZeng23 分钟前
通信与接口协议面试十七、SFP光模块
单片机·嵌入式硬件·面试·通信与接口协议
Niuguangshuo24 分钟前
TTS 架构的六代演进(一):三段式链路与评测框架
架构
名字还没想好☜33 分钟前
Go error 处理:errors.Is/As 与错误包装
开发语言·后端·golang·go·错误处理
doiito1 小时前
【安全,架构】RustyVault 项目深度分析报告以及和HashiCorp Vault的差异
后端·安全·rust
武子康1 小时前
调查研究-224 Prefill 与 Decode 分离:高并发 LLM Serving 的下一层架构
人工智能·ai·架构·llm·gpu·vllm·sglang
ting94520001 小时前
技术解析:Owl Alpha 底层架构与 OpenRouter 模型网关全链路实现(无营销、纯技术向)
人工智能·架构