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