作者回复: 直接用put即可,可以参考这里的回复:
https://stackoverflow.com/questions/19528304/how-to-get-the-threadpoolexecutor-to-increase-threads-to-max-before-queueing
不过要考虑选择丢数据还是阻塞
其实,实现自己的RejectedExecutionHandler耦合自己的Queue也无可厚非。Tomcat也是这样的,其实现参考这里:https://github.com/apache/tomcat/blob/a801409b37294c3f3dd5590453fb9580d7e33af2/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
作者回复: 👍🏻
作者回复: 👍🏻
作者回复: ThreadPoolExecutor回收不了,可以看看其源码,工作线程Worker是内部类,只要它活着,换句话说线程在跑,就会阻止ThreadPoolExecutor回收,所以其实ThreadPoolExecutor是无法回收的,并不能认为ThreadPoolExecutor没有引用就能回收
作者回复: 这段代码不是很能理解意思,testCompletableFutureDefaultExecutor是什么?最好给出源码链接
作者回复: 1. 你说的这种策略,此文也有提到: https://stackoverflow.com/questions/19528304/how-to-get-the-threadpoolexecutor-to-increase-threads-to-max-before-queueing
其实,我们希望的是尽量确保有足够多的线程能处理任务,但是又不闲置过多线程,或临时创建过多线程,换句话说让线程的创建和回收不要太频繁。选择哪个策略要根据任务的性质和压力的流量形态来决定。
2. 这里我说的复用线程池是指不每次都创建线程池,线程池必须复用而不是按需创建,但是不推荐一味混用一个线程池。对于选择是否混用线程池,至少对于频+快的任务和少+慢的任务应该分开,还是要根据实际任务的性质来选择。
作者回复: 通过数据库来查询统计就是IO操作,既然项目都不同了,那么就不是一个进程了,我们说的线程池隔离是针对一个进程的
作者回复: 你是什么os呢?我是macos没有遇到过这个问题,尝试先重启docker service,或OS。docker-compose是方便大家快速启动依赖,不是必须的,实在不行你可以自己手动安装mysql,都是一样的
作者回复: 1、可以想想tomcat为什么觉得这样激进的线程更适合。其实.NET的线程池就是这样的弹性线程池,只不过创建新的线程还会有一定的思考时间,延迟新线程的创建,更智能。
2、其实和任务慢不慢没有太大关系,即使任务不慢,不复用也是有问题的。