Android中线程池ExecutorService的使用

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天看了一下有关线程方面的使用。以前我通常只是通过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(){});

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

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

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

//指示当所有线程执行完毕后关闭线程池和工作线程,如果不调用此方法,jvm不会自动关闭
allTaskExecutor.shutdown();     
  try {  
       //等待线程执行完毕,不能超过2*60秒,配合shutDown
       allTaskExecutor.awaitTermination(2*60, TimeUnit.SECONDS);  
  catch (InterruptedException e) {  
       e.printStackTrace();  
  }  

二,submit

 submit()执行,执行有返回值Future(?)


ExecutorService介绍两个方法:

1、shutdown方法:这个方法会顺次地关闭ExecutorService,当我们调用这个方法时,ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。

2、awaitTermination方法:这个方法有两个参数,一个是timeout即超时时间,另一个是unit即时间单位。这个方法会使线程等待timeout时长,当超过timeout时间后,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值