本文是介绍线程池的基础篇。
一、线程池的作用
创建异步线程的弊端:
1、每次new Thread创建对象,导致性能变差。
2、缺乏统一的管理,可能导致无限制的线程运行,严重的后果就是OOM 或者死机。
使用线程池的有点:
1、重用性大,减少对象的创建,提高性能。
2、可有效控制并发线程数,提高系统资源利用率,避免资源争夺。
3、可提供多种功能:定时、循环、并发、单一等功能。
三、ExecutorService 线程池
Java通过Executors提供了四类常用的线程池。
1、newCachedThreadPoll
定义一个线程池,当线程池里面有可复用的线程,重用线程执行,如果没有,新建线程执行。线程池容量可以无线大。
ExecutorService cacheThread = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
cacheThread.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
2、newSingleThreadExecutor
创建一个线程池,只有唯一的一个活动的工作线程,有序(FIFO,LIFO,优先级等顺序)的处理队列中的任务。
ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 100; i++) {
singleExecutor.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
3、newFixedThreadPool
定义一个可用并发数的线程池,超过并发数的线程,在队列里面等待。
ExecutorService fixedThread = Executors.newFixedThreadPool(3);
for(int i = 0; i < 100 ; i ++){
fixedThread.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
4、newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
ScheduledExecutorService scheduledThread = Executors.newScheduledThreadPool(3);
//延时执行
scheduledThread.schedule(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 2*1000, TimeUnit.SECONDS);
//固定的间隔执行,不受任何影响
scheduledThread.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 10*1000, 1*1000, TimeUnit.SECONDS);
//当线程执行完毕后的,开始计算时间间隔再次执行
scheduledThread.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 10*1000, 1*1000, TimeUnit.SECONDS);
四、AnsyncTask异步线程
提供两个线程池:
1、THREAD_POOL_EXECUTOR异步线程池
2、SERIAL_EXECUTOR同步线程池
使用方式:
new AsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 0);
注意:
1、当默认使用AsyncTask.execute()执行异步任务,默认使用SERIAL_EXECUTOR.
2、SERIAL_EXECUTOR是在THREAD_POOL_EXECUTOR基础上,加一个task的集合来维护顺序的。