我们在进行异步处理时,一般做法是new Thread(),但会存在以下问题:
过多的线程不方便统一管理
大量线程占用系统资源
每次创建线程影响性能
采用线程池能够控制线程并发数
实现单线程顺序执行
重复使用线程池中的线程
ThreadPoolExecutor是线程池的实现类
类内部用一个队列管理任务
通过Executor框架的工具类Executors,可以创建3钟类型的ThreadPoolExecutor
-FiexedThreadPool
-SinlgeThreadExecutor
-CachedThreadPool
下面对3中线程池进行详细说明:
FixThreadPool
被称为可重用固定线程数的线程池
适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景
1当前运行的线程数少于设置线程数,则创建新线程
2当前运行线程数等于设置线程数,任务将加入LinkBlockingQueue
3线程执行完任务后,会从LinkBlockingQueue获取等待的任务来执行
SinlgeThreadExecutor
是使用单个线程
适用于保证顺序执行各个任务,并且在任意时间点不会有多个线程活动的应用场景
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
CacheThreadPool
是一个根据需要创建新线程的线程池
当主线程提交任务速度高于CacheThreadPool中线程处理任务速度时,会不断创建新线程。极端情况下,CacheThreadPool会因为创景过多线程而耗尽CPU和内存资源。