android提供的线程池
new Thread的缺点:
- 每次new Thread新建对象都会影响性能
- 线程缺乏统一管理,可能出现无限制新建线程,导致相互竞争,及可能占用过多系统资源导致死机或oom
- 没有定时执行、定期执行、线程中断等功能
相比new Thread,Java提供的四种线程池的优点:
- 重用存在的线程,减少对象创建、消亡的开销,性能好
- 能够有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
- 提供定时执行、定期执行、单线程、并发数控制等功能
android的线程池主要有四个:
- newSingleThreadExecutor:单线程池,只有一个线程在运行
- newCachedThreadPool :回收型线程池,可以重复利用之前创建过的线程,运行线程最大数是Integer.MAX_VALUE
- newFixedThreadPool:固定大小的线程池,跟回收型线程池类似,只是可以限制同时运行的线程数量
- ScheduledExecutorService:可以实现循环或延迟任务的线程池。
newSingleThreadExecutor
newSingleThreadExecutor是用来创建一个单线程的线程池,这种情况下只有一个线程在工作。如果这个线程由于各种原因结束,则会创建一个新的线程来代替它。当任务提交时会按顺序插入任务队列,执行时从队列头部取出任务执行,保证了所有任务的执行顺序按照提交顺序来执行。
newSingleThreadExecutor Demo已上传GitHub
newCachedThreadPool
一个可以根据需要创建新线程的线程池。如果在使用时,线程池中的线程没有空闲的,则创建一个新线程并添加到池中;如果有被使用完又还没被销毁的线程,则复用该线程。线程池中那些超过 60 秒未被使用的线程,将会被终止并从缓存中移除。因此,长时间保持空闲的线程池不会使用任何资源。
这种线程池比较灵活,对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。
newCachedThreadPool Demo已上传GitHub
newFixedThreadPool
创建一个固定数量nThreads的线程池。线程池中的线程操作同一个共享的无界队列。在任意时刻,最多只有nThreads个线程在同时执行,如果此时,有新的任务提交到无界队列中,那么它只有等待,直到线程池中有一个线程可用为止。如果线程池的任何线程由于在执行期间失败而被终止了,此时,如果有新的任务在无界队列中,那么它就会创建一个新的线程来取代被关闭了线程,但线程总数不超过nThreads。线程池中的线程不会自动关闭,需要我们主动去关闭它们。
ScheduledExecutorService
最大优点除了线程池的特性以外,还可以实现循环或延迟任务。
ScheduledExecutorService 和 Timer 的区别
Timer的内部只有一个线程,如果有多个任务的话就会顺序执行,这样我们的延迟时间和循环时间就会出现问题。ScheduledExecutorService是线程池,所以就不会出现这个情况,在对延迟任务和循环任务要求严格的时候,就需要考虑ScheduledExecutorService了。
Demo
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/99977538
- 点赞
- 收藏
- 关注作者
评论(0)