企业级线程池实战-线程超时点位后置问题

本文介绍了线程池的基础知识,包括四大线程池类型及其特点,并深入探讨了ThreadPoolExecutor的参数和拒绝策略。在实际线上问题中,分析了线程池设置超时时间的误区,指出无界队列可能导致的线上问题以及线程池超时设置的正确位置,强调了超时时间设置的重要性。
摘要由CSDN通过智能技术生成

在直接面向消费者的业务中,往往对请求的RT要求特别高,同时为了保护系统不被单一的超时问题拖垮,需要我们在异步请求时设置线程池请求的超时时间,但是请求的超时时间设置的点位不对,不但不能起到时间的限制作用,排查问题时还会具有很高迷惑性(因为代码设置了超时时间,在排查时很容易直接越过有问题的代码)

知识储备

先介绍一下线程池的基础知识。

线程池的作用

● 线程池可以管理进行线程生命周期的管理
● 线程池降低资源的消耗
● 线程池可以提高系统的响应速度
● 线程池可以控制并发访问的数量

常见的四大线程池

newCachedThreadPool 可缓存线程池

描述

如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。特点

特点

线程的创建数量几乎没有限制。这样可灵活的往线程池中添加线程。
如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程

注意事项

要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。

源码
public static ExecutorService newCachedThreadPool() {
   
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

newFixedThreadPool 指定线程数量

描述:

创建一个指定工作线程数量的线程池。
每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

特点:

提高程序效率和节省创建线程时所耗的开销

注意事项

线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。

源码
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
   
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>(),
                                      threadFactory);
    }

newSingleThreadExecutor————单线程的Executor

描述:

只创建唯一的线程来执行任务。保证任务按照指定顺序(FIFO,LIFO,优先级)执行。
如果这个线程异常结束,会有另一个取代它

源码
public static ExecutorService newSingleThreadExecutor(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值