
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程的学习与应用是每一个软件开发程序员都应该熟练掌握的一个编程开发知识点,今天南宁达内小编就和大家一起来学习一下,软件开发线程应用与任务执行分析。
线程的数量怎么限制?动态变化?自动伸缩?
线程池本身,就是为了限制和充分使用线程资的,因此有了两个概念:核心线程数,大线程数。
要想让线程数根据任务数量动态变化,那么我们可以考虑以下设计(假设不断有任务):
来一个任务创建一个线程处理,直到线程数达到核心线程数。
达到核心线程数之后且没有空闲线程,来了任务直接放到任务队列。
任务队列如果是无界的,会被撑爆。
任务队列如果是有界的,任务队列满了之后,还有任务过来,会继续创建线程处理,此时线程数大于核心线程数,直到线程数等于大线程数。
达到大线程数之后,还有任务不断过来,会触发拒绝策略,根据不同策略进行处理。
如果任务不断处理完成,任务队列空了,线程空闲没任务,会在一定时间内,销毁,让线程数保持在核心线程数即可。
由上面可以看出,主要控制伸缩的参数是核心线程数,大线程数,任务队列,拒绝策略。
线程怎么消亡?如何重复利用?
线程不能被重新调用多次start(),因此只能调用一次,也就是线程不可能停下来,再启动。那么就说明线程复用只是在不断的循环罢了。
消亡只是结束了它的run()方法,当线程池数量需要自动缩容的,就会让一部分空闲的线程结束。
而重复利用,其实是执行完任务之后,再去去任务队列取任务,取不到任务会等待,任务队列是一个阻塞队列,这是一个不断循环的过程。
任务相关
任务少可以直接处理,多的时候,放在哪里?
任务少的时候,来了直接创建,赋予线程初始化任务,就可开始执行,任务多的时候,把它放进队列里面,先进先出。
任务队列满了,怎么办?
任务队列满了,会继续增加线程,直到达到大的线程数。
用什么队列?
一般的队列,只是一个有限长度的缓冲区,要是满了,就不能保存当前的任务,阻塞队列可以通过阻塞,保留出当前需要入队的任务,只是会阻塞等待。同样的,阻塞队列也可以保证任务队列没有任务的时候,阻塞当前获取任务的线程,让它进入wait状态,释放cpu的资源。因此在线程池的场景下,阻塞队列其实是比较有必要的。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。