作者回复: 你的理解原则上是正确的。具体一点,jdk线程池标准模式当核心线程数超过后直接进队列,不是新建线程,这个方式不适合io型多任务。
作者回复: 是的。jdk线程池用的普通队列,不适合io型多任务处理。
作者回复: 都是好问题。notifyall会唤醒全部,但是代码中一旦标志不符合就会继续等待,不会出现几个同时处理,你仔细跟代码。recycle我也认为会出现并发问题,你这个观察很好,这段代码取自Tomcat4源代码,应该是有问题。 线程池大小,很复杂,大师们有个公式,依赖于核还有计算时间等待时间,但是实际系统复杂,很不好估算计算时间等待时间,并且还有别的进程共用CPU,所以呢,不好回答,我一般拍脑袋就是讲线程池大小设置为核的数量。
作者回复: 简单来讲,jdk线程池使用普通队列,当并发任务数超过了核心大小后,直接进队列等待,这种方式比较适合CPU型多任务。但是servlet的应用场景是io型的,所以Tomcat要自己实现。我们也可以比较简单地重写jdk队列的offer方法,数量没有达到最大线程数就返回false,让线程池新建线程。