java线程池问题, 欢迎解答

图片说明
图片说明
图片说明
有上图可以看出来 , 将线程池的数量设置为 1 和 3 , 完成的时间是差不多的 , 这么什么原因呢 ?

处理的内容太少了 看不出消耗 多线程和单线程完全没什么区别 你里面放个循环 再试试

而且 , 我设置了 maximumPoolSize 好像并没有起作用哦 ,

按照我的设想 : 当当地一条线程sleep 后 ,第二条线程就开始执行 ,然后第二条线程再sleep , 也就是说 第二条线程和第一条线程的sleep时间是有很多重合的
, 这样就可以大幅度的缩短执行时间 . 但是好像并不是这样的啊 .

我好像知道了 , 应该是 因为阻塞是发生在 get方法哪里 , 所以只有等get到了 ,才会进行下一次循环 , 哈哈哈

图片说明

这样子就可以得到想要的结果了 .

你是把任务提交一次到线程池就开始等待一次线程池返回

当当地一条线程sleep 后 ,第二条线程就开始执行 ,然后第二条线程再sleep , 也就是说 第二条线程和第一条线程的sleep时间是有很多重合的
, 这样就可以大幅度的缩短执行时间 . 但是好像并不是这样的啊 .

问题在于你使用的线程暂存队列SynchronousQueue。SynchronousQueue是一个无空间的队列。还有你线程池数量的限制。线程池有两个数量。核心线程量和总线程量。你说的1和3是核心线程量。10是总线程量。线程任务提交给线程池的流程是首先看是否有空闲的核心线程,如果有就交于核心线程处理。如果没有就到暂存队列中等待核心线程释放。如果暂存队列也被放满(现在就是这种情况,SynchronousQueue是一个无空间队列,你可以理解为一直就是满的),就会创建临时线程直接处理溢出的任务。如果临时线程+核心线程达到了总线程量,而且还有任务提交。线程池就会执行拒绝策略(拒绝策略是可设置且可自定义的。默认的策略的AbortPolicy:丢弃要加入线程池的任务并抛出RejectedExecutionException异常。)。到这里你应该可以明白了为什么时间相隔不打。因为你的线程池执行过程不过是1个核心线程9个临时线程与3个核心线程7个临时线程的区别而已。实质上都是10个线程在处理。你可以尝试使用其他队列作为线程任务暂存队列来看看结果。