在直接面向消费者的业务中,往往对请求的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(