在一个类中,可能会依赖多个其他的方法或者外部信息,我们目前的做法是启动线程并行去获取这些信息。这样做就会用到线程池。用到线程池就有可能会出现线程池阻塞的情况。
我们用到的是Callable和Future创建线程(和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要强大。1、call()方法可以有返回值2、call()方法可以声明抛出异)。
但是最近一次发布后抛出了
org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@431595e6[Running, pool size = 32, active threads = 32, queued tasks = 1000, completed tasks = 76395]] did not accept task
从上面的报错中我们可以看到,我们的线程池设置的最大线程数是32,等待队列是1000,而我们设置的core为4,之前设置时以为,当线程数大于4个时就会继续创建线程,直到达到最大的32个线程数,但是在网上查了资料以后发现,线程池创建线程是超过最大的等待队列1000以后才会继续创建线程直至32个,所以在出现这个错误时,其实已经有1032个线程在等待中了。
可以从配置数上看到,我们的线程池设置是有问题的,常驻线程、最大线程 偏小,而等待线程则过大,后面我们调整为各个参数。
但是此次线程池打满的原因是因为,有位小伙伴再异步线程中 调用外部接口,因为我们接口请求量比较大,再线程中有接口请求的话,那么此次线程在等待 接口的响应,如果接口响应比较慢,那么次线程一直等待,最后会造成等待线程积压,导致线程爆掉。
所以在线程中不要有接口访问。