Open GzwJaaaelu opened 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和拒绝策略的关系
我的理解是 ~~核心线程空闲,先占住核心线程,前两个在核心线程中执行, _第三个任务新开线程。 核心线程结束后不销毁,会等待下次任务,非核心线程任务结束会等待一段时间(传入的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和拒绝策略的关系