Tomcat线程池
Tomcat在哪里用到了线程池呢?
- LimitLatch用来限流,可以控制最大连接个数,类似J.U.C中的Semaphore后面再讲
- Acceptor只负责[接收新的socket连接]
- Poller 只负责监听socket channel是否有[可读的IO事件]
- 一旦可读,封装-一个任务对象(socketProcessor) ,提交给Executor线程池处理
- Executor 线程池中的工作线程最终负责[处理请求]
Tomcat线程池扩展了ThreadPoolExecutor,行为稍有不同
- 如果总线程数达到maximumPoolSize
- 这时不会立刻抛RejectedExecutionException异常
- 而是再次尝试将任务放入队列,如果还失败,才抛出RejectedExecutionException异常
当父类因为线程池达到了最大线程数而抛出拒绝策略异常时,子类捕捉后将任务在强迫加入道队列里面,如果此时再失败就抛出异常
Tomcat线程池配置
Conrector配置
tomcat是守护线程,主线程结束,程序就结束了
Executor线程配置
默认队列是无界的,那就是没有机会创建救急线程??
tomcat对其做出了改变,当任务数小于核心线程数将其添加到队列。当核心线程数<任务数<最大线程数时,不是将其添加到队列而是创建救急线程。