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