Android 多线程处理之多线程用法大集合 第 3 页
2015-08-24 16:12
549 查看
第 3 页 ExecutorServie线程池
5.ExecutorServie线程池
通过Executors的静态方法来创建,一般有三种:
1.单线程 :Executors.newSingleThreadExecutor();
2.固定数量线程 :Executors.newFixedThreadPool();
3.动态线程 :Executors.newCachedThreadPool();
这里我们用固定5个线程来应用,使用方法是创建ExecutorService对象,然后执行submit(r)可以发起一个Runnable对象。用线程池来管理的好处是,可以保证系统稳定运行,适用与有大量线程,高工作量的情景下使用,假如要展示1000张图片如果创建1000个线程去加载,保证系统会死掉。用线程池就可以避免这个问题,可以用5个线程轮流执行,5个一组,执行完的线程不直接回收而是等待下次执行,这样对系统的开销就可以减小不少。
private void loadImagesByExecutors(final String url,final int id){
service.submit(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
Log.e("当前线程:", ""+Thread.currentThread().getName());
try {
final Drawable drawable = Drawable.createFromStream(new URL(url).openStream(), "image.gif");
mainHandler.post(new Runnable(){
@Override
public void run() {//这将在主线程运行
// TODO Auto-generated method stub
((ImageView)MainActivity.this.findViewById(id)).setImageDrawable(drawable);
}
});
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
Log:
其实可能没有说清楚,第一种不算多线程。
1.loadImagesByHandler()是通过Handler.post()方法,构建两个Handler进行通信。
2.loadImagesByThread(),这个是直接new Thread()发起线程,在主线程的handler处理消息
3.loadImageByAsyncTask(),这个用的是异步任务,所有实现在它的内部结构里,可以在里头操作Ui.
4.loadImagesByExecutors()用的是线程池,使得线程可控,保证稳定运行。
其实常用的就是后三种,第二个用法灵活,简单,但不适宜大数量任务;第三个一般适用于单个任务,一次性任务;第四个一般用于大数量,高密度执行的使用情景,比如批量加载图片,批量下载文件等。
看一眼图吧:
5.ExecutorServie线程池
通过Executors的静态方法来创建,一般有三种:
1.单线程 :Executors.newSingleThreadExecutor();
2.固定数量线程 :Executors.newFixedThreadPool();
3.动态线程 :Executors.newCachedThreadPool();
这里我们用固定5个线程来应用,使用方法是创建ExecutorService对象,然后执行submit(r)可以发起一个Runnable对象。用线程池来管理的好处是,可以保证系统稳定运行,适用与有大量线程,高工作量的情景下使用,假如要展示1000张图片如果创建1000个线程去加载,保证系统会死掉。用线程池就可以避免这个问题,可以用5个线程轮流执行,5个一组,执行完的线程不直接回收而是等待下次执行,这样对系统的开销就可以减小不少。
private void loadImagesByExecutors(final String url,final int id){
service.submit(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
Log.e("当前线程:", ""+Thread.currentThread().getName());
try {
final Drawable drawable = Drawable.createFromStream(new URL(url).openStream(), "image.gif");
mainHandler.post(new Runnable(){
@Override
public void run() {//这将在主线程运行
// TODO Auto-generated method stub
((ImageView)MainActivity.this.findViewById(id)).setImageDrawable(drawable);
}
});
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
Log:
其实可能没有说清楚,第一种不算多线程。
1.loadImagesByHandler()是通过Handler.post()方法,构建两个Handler进行通信。
2.loadImagesByThread(),这个是直接new Thread()发起线程,在主线程的handler处理消息
3.loadImageByAsyncTask(),这个用的是异步任务,所有实现在它的内部结构里,可以在里头操作Ui.
4.loadImagesByExecutors()用的是线程池,使得线程可控,保证稳定运行。
其实常用的就是后三种,第二个用法灵活,简单,但不适宜大数量任务;第三个一般适用于单个任务,一次性任务;第四个一般用于大数量,高密度执行的使用情景,比如批量加载图片,批量下载文件等。
看一眼图吧:
相关文章推荐
- android 使用log4j SLF4J 输出日志到文件中
- Android 多线程处理之多线程用法大集合 第2页
- Android 多线程处理之多线程用法大集合 第 1 页
- android Google地图开发
- Android SurfaceView实战 带你玩转flabby bird (下)
- Mars老师的Android学习路线。
- android ViewPager滑动欢迎界面
- 解决Fetching android sdk component information加载过久问题
- Android layer-list 圆角阴影背景
- Android Cursor
- 学习android 显式Intent和隐式Intent
- 在android5.1的init进程中加入读取手机序列码
- Android百分比布局支持库介绍——com.android.support:percent
- Android在Fragment中监听软键盘的弹出和关闭
- android性能优化基础篇(循环的优化)
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
- Android(java)学习笔记193:利用谷歌API对数据库增删改查(推荐使用)
- Android与设计模式
- Android 监听键盘弹出关闭
- Android项目利用jinkens自动打包