使用线程池的目的
我们可以对我们开启的线程进行跟进,当我们不需要处理的时候可以将它shutdow掉,同时当我们定义了一个线程池之后,可以复用线程而不需要开启更多线程,开启的thread越多意味着你的app内存消耗越多,速度也就越来越慢,提高现有线程的复用。一般一个线程1MB内存,通常一个进程分配1G的内存,所以最多可以创建1024个线程(但是需要留有一定的内存做其他的事情,所以达不到1024个线程)
代码如下
public class ThreadpoolTest extends Activity implements View.OnClickListener{
private static ExecutorService mCacheThreadExcutor =null;
private static final int count =3;
private static ExecutorService mFixThreadExecutor = null;
private static ScheduledExecutorService mScheduledThreadExecutor = null; //能和Timer/TimerTask类似,解决那些需要任务重复执行的问题
private static ExecutorService mSingleThreadExecutor = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_threadpool);
initView();
initExecutorService();
}
private void initExecutorService() {
//ExecutorService 线程池接口
mCacheThreadExcutor = Executors.newCachedThreadPool(); //可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行
mFixThreadExecutor = Executors.newFixedThreadPool(count); //固定数量的线程池,每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
mScheduledThreadExecutor = Executors.newScheduledThreadPool(count);//大小无限制的线程池,支持定时和周期性的执行线程
mSingleThreadExecutor = Executors.newSingleThreadExecutor(); //单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
}
private void initView() {
findViewById(R.id.cache_thread_executorbtn).setOnClickListener(this);
findViewById(R.id.fixed_thread_executorbtn).setOnClickListener(this);
findViewById(R.id.scheduled_thread_executorbtn).setOnClickListener(this);
findViewById(R.id.single_thread_executorbtn).setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.cache_thread_executorbtn:
ExecutorServiceThread(mCacheThreadExcutor);
break;
case R.id.fixed_thread_executorbtn:
ExecutorServiceThread(mFixThreadExecutor);
break;
case R.id.scheduled_thread_executorbtn:
ExecutorScheduleServiceThread(mScheduledThreadExecutor);
break;
case R.id.single_thread_executorbtn:
ExecutorServiceThread(mSingleThreadExecutor);
break;
}
}
private void ExecutorScheduleServiceThread(ScheduledExecutorService mScheduledThreadExecutor) {
for (int i = 0; i < 9; ++i) {
final int index = i;
mScheduledThreadExecutor.schedule(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("ThreadpoolTest","Thread_ScheduledThread"+Thread.currentThread().getId()+"activeCount:"+Thread.activeCount()
+" index "+index);
}
},2,TimeUnit.SECONDS);
}
}
private void ExecutorServiceThread(ExecutorService executorService) {
for (int i =0;i<9;++i){
final int index =i;
executorService.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("ThreadpoolTest","Thread"+Thread.currentThread().getId()+"activeCount:"+Thread.activeCount()
+" index "+index);
}
});
}
}
}总结
- Executors.newCachedThreadPool():可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行
- Executors.newFixedThreadPool(count):固定数量的线程池,每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
- Executors.newScheduledThreadPool(count):大小无限制的线程池,支持定时和周期性的执行线程
- Executors.newSingleThreadExecutor(); 单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
版权声明:本文为qq_27647919原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。