课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程池技术的应用在许多软件开发项目中都是会经常见到的一个编程技术,而本文我们就简单来了解一下,线程池基础知识分享。
1、线程池有哪些关键属性?
corePoolSize到maximumPoolSize之间的线程会被回收,当然corePoolSize的线程也可以通过设置而得到回收(allowCoreThreadTimeOut(true))。
workQueue用于存放任务,添加任务的时候,如果当前线程数超过了corePoolSize,那么往该队列中插入任务,线程池中的线程会负责到队列中拉取任务。
keepAliveTime用于设置空闲时间,如果线程数超出了corePoolSize,并且有些线程的空闲时间超过了这个值,会执行关闭这些线程的操作
rejectedExecutionHandler用于处理当线程池不能执行此任务时的情况,默认有抛出RejectedExecutionException异常、忽略任务、使用提交任务的线程来执行此任务和将队列中等待久的任务删除,然后提交此任务这四种策略,默认为抛出异常。
2、线程池中的线程创建时机?
如果当前线程数少于corePoolSize,那么提交任务的时候创建一个新的线程,并由这个线程执行这个任务;
如果当前线程数已经达到corePoolSize,那么将提交的任务添加到队列中,等待线程池中的线程去队列中取任务;
如果队列已满,那么创建新的线程来执行任务,需要保证池中的线程数不会超过maximumPoolSize,如果此时线程数超过了maximumPoolSize,那么执行拒绝策略。
3、任务执行过程中发生异常怎么处理?
如果某个任务执行出现异常,那么执行任务的线程会被关闭,而不是继续接收其他任务。然后会启动一个新的线程来代替它。
4、什么时候会执行拒绝策略?
workers的数量达到了corePoolSize,任务入队成功,以此同时线程池被关闭了,而且关闭线程池并没有将这个任务出队,那么执行拒绝策略。这里说的是非常边界的问题,入队和关闭线程池并发执行,读者仔细看看execute方法是怎么进到一个reject(command)里面的。
workers的数量大于等于corePoolSize,准备入队,可是队列满了,任务入队失败,那么准备开启新的线程,可是线程数已经达到maximumPoolSize,那么执行拒绝策略。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。