Android中线程池ExecutorService的使用

本文介绍了Android中线程池ExecutorService的使用,对比了直接使用new Thread的缺点,并详细讲解了ExecutorService的四种线程池类型:可缓存线程池、定长线程池、定时线程池和单线程池。还提到了如何通过execute和submit方法执行任务,以及shutdown和awaitTermination方法来管理线程池。
摘要由CSDN通过智能技术生成

这两天看了一下有关线程方面的使用。以前我通常只是通过new Thread(){}.start;来创建一个线程并进行相应的使用,可是没有考虑过当线程过多,从而影响到手机的性能。看了一些有关线程池方面的东西,现在这里写下初步认识,以备以后查阅,个人笔记,如果有朋友有更多了解,请通知我。其中部分文章来自网络转载。

下面先说说直接new Thread的缺点:

1,每次new Thread新建对象就要开辟一定的内存,消耗比较大;

        2,线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。

3,缺乏更多功能,如定时执行、定期执行、线程中断。


线程池的好处:

1,重用存在的线程,减少对象创建、消亡的开销,性能佳。

2,可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

3,提供定时执行、定期执行、单线程、并发数控制等功能。


ExecutorService是Executor的接口实现类但它还是一个接口。Executors是一个工厂类,用于创建我们需要的ExecutorService线程池对象,下面介绍能创建的线程池对象。

1,Executors.newCachedThreadPool() ---allTaskExecutor

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

2,Executors.newFixedThreadPool(int nThreads) ---limitedTaskExecutor

创建一个定长(个数为nThreads)线程池,可控制线程最大并发数,超出的线程会在队列中等待。

3,Executors.newScheduledThreadPool(int corePoolSize) --- scheduledTaskExecutor

创建一个定长(活动个数为corePoolSize)线程池,支持定时及周期性任务执行。

4,Executors.newSingleThreadExecutor() --- singleTaskExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

注意:其中1,2,4底层直接或间接调用到的是ThreadPoolExecutor,ThreadPoolExecutor如下构造方法:

	ThreadPoolExecutor(int corePoolSize, // 线程池维护线程的最少数量
                          int maximumPoolSize, // 线程池维护线程的最大数量 
                          long keepAliveTime, // 线程池维护线程所允许的空闲时间
                          TimeUnit unit, // 线程池维护线程所允许的空闲时间的单位
                          BlockingQueue<Runnable> workQueue, // 线程池所使用的缓冲队列
                          ThreadFactory threadFactory, // 当执行创建一个新的线程时使用的工厂类
                          RejectedExecutionHandler handler) //  线程池对拒绝任务的处理策略 

而3,创建出来的类为ScheduledThreadPoolExecutor,scheduledTaskExecutor可以通过查看类中的方法寻找自己所需求的功能。  

线程池的执行:

一,execute

// 同时并发5个工作线程,execute的执行没有返回值,其中Runnable是可以不同的

allTaskExecutor.execute(new Runnable(){ });

allTaskExecutor.execute(new Runnable(){

Android 线程池主要有以下四种类型: 1. FixedThreadPool:该线程池的线程数量是固定的,如果线程处于空闲状态,它们将会被保留在池,当任务到达时,它们会被立即执行。如果线程池的所有线程都处于忙碌状态,任务将会被放入到队列等待执行。 2. CachedThreadPool:该线程池的线程数量是不固定的,线程数会根据任务的多少自动调整。如果有大量任务需要执行,会创建更多的线程来处理这些任务,如果有较少的任务需要执行,线程池的线程数量会自动减少。 3. SingleThreadExecutor:该线程池只有一个线程,所有任务将会在这个线程按顺序执行。如果该线程因为异常而终止,那么将会创建一个新的线程来代替它。 4. ScheduledThreadPool:该线程池用于执行一些需要定时执行的任务,比如定时执行一些操作、周期性地执行某些任务等。 以下是一个使用 FixedThreadPool 的示例代码: ``` ExecutorService executorService = Executors.newFixedThreadPool(5); // 提交任务给线程池执行 executorService.submit(new Runnable() { @Override public void run() { // 执行任务的代码 } }); // 关闭线程池 executorService.shutdown(); ``` 其他类型的线程池使用方式与 FixedThreadPool 类似,只需要将 `Executors.newFixedThreadPool()` 替换为对应的方法即可。在使用线程池时,需要根据具体的业务需求选择合适的线程池类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值