时间:2021-05-19
异步编程工具在Android开发中目前最被推荐的就是Kotlin协程,在引入Kotlin协程机制前,除了响应式扩展(RxJava)兼任异步编程工具外,Java API中线程与线程池就是最重要异步编程手段。而对于Android平台的Kotlin协程实现来说,依然使用的是线程池来作为任务执行的载体,所以可以将Android平台的Kotlin协程简单的理解是对线程池的一种高度封装。
因此我们先了解Java线程池是如何运行的,再深入理解Kotlin协程是如何实现的。
从Thread到Executor
线程的创建通过Thread类,为了复用线程而进行池化就有了线程池。线程池带来了两点明显优势:
Executor接口就是第二点的体现。其execute方法用于执行任务,不必关系这个任务执行的载体究竟是什么,到底有没有创建线程。ThreadPoolExecutor实现类就是这个任务执行器的线程池实现。
ThreadPoolExecutor的任务添加与线程复用
查看execute方法可以清楚了解其运行方式:
boolean addWorker(Runnable firstTask, boolean core)就是创建线程的方法,方法中第二个参数代表以corePoolSize还是maximumPoolSize为界,方法内其余创建线程的细节逻辑不深究。但要关注一下线程的封装类Worker,addWorker方法内调用了Worker内被封装线程的start方法,执行Worker的run方法。我们将run方法内的runWorker简化如下:
可以发现,初始任务执行完后,不断通过getTask方法获取任务执行,以此来实现线程的复用,而不是只执行完一个任务就销毁了线程。
另外查看简化后的getTask方法如下:
任务是从阻塞队列workQueue中取出的,并且根据配置allowCoreThreadTimeOut与线程个数是否大于corePoolSize,来决定使用BlockingQueue<Runable>的带超时时间的取任务方法poll,还是阻塞取任务方法take,以实现任务列表为空时适时销毁线程还是阻塞线程。
回过头来看ThreadPoolExecutor的构造方法:
我们可以清楚的明白每个参数的含义,以及它是如何影响线程池中线程的复用了。
到此这篇关于浅谈Java线程池是如何运行的的文章就介绍到这了,更多相关Java 线程池内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
从Java5开始,Java提供了自己的线程池。线程池就是一个线程的容器,每次只执行额定数量的线程。java.util.concurrent.ThreadPool
线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。线程池也有5种状态;然而,线程池不同于线程,线程池的5种状态是:Running,SHUTDOW
一、简介什么是线程池?池的概念大家也许都有所听闻,池就是相当于一个容器,里面有许许多多的东西你可以即拿即用。java中有线程池、连接池等等。线程池就是在系统启动
Java线程池ExecutorService1.线程池 1.1什么情况下使用线程池单个任务处理的时间比较短.将需处理的任务的数量大.1.2使用线程池的好处减少在
详解Java线程池和Executor原理的分析线程池作用与基本知识在开始之前,我们先来讨论下“线程池”这个概念。“线程池”,顾名思义就是一个线程缓存。它是一个或