MicroKibaco / CrazyDailyQuestion

每日一问: 水滴石穿,聚沙成塔,坚持数月, 必有收获~
35 stars 1 forks source link

2019-09-24:线程池核心线程数为 2,最大线程数为 4,队列是个无界队列,这时我一次性提交了三个任务,这些任务会怎么执行,在哪些线程执行? #41

Open GzwJaaaelu opened 5 years ago

ycpbyht commented 5 years ago

我的理解是 ~~核心线程空闲,先占住核心线程,前两个在核心线程中执行, _第三个任务新开线程。 核心线程结束后不销毁,会等待下次任务,非核心线程任务结束会等待一段时间(传入的keepalivetime)后回收 如果来到第五个(>maxpoolsize)会先使用缓存队列,超出缓存队列使用线程池的拒绝策略~~

9.25更新 有界队列的情况,比如来了三个任务ABC,队列最大2,ArrAyBlockingQueue(2) AB执行,core 满了的时候,新加入的线程C会加入队列等待AB结束使用AB的线程。如果在来新的任务,依然进入队列,比如队列最大2个,之后,再加入DE,D进入队列等待,E会new 线程执行。

9.26更新 ThreadPoolExecutor(core, max, 60L, TimeUnit.SECONDS, new BlockingQueue()); 根据测试 SynchronousQueue类型,传入的任务>max,会抛异常,然后只会执行max数量的任务,后面的被抛弃 LinkedBlockingQueue,传入的任务>max,会直接启用全部线程,因为内部只直接返回了个最大值,LinkedBlockingQueue(MAX),比如指定LinkedBlockingQueue(2),效果类似于ArrAyBlockingQueue(2) 使用无界队列,TransferQueue,只会运行ab,C等待

建议大家自己尝试打印一下吧,BlockingQueue和拒绝策略的关系