android线程池ThreadPoolExecutor的理解
android线程池ThreadPoolExecutor的理解
线程池
我自己理解看来。
线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable,
注意:每一个线程都是需要CPU分配资源去执行的。如果由于总是
new Thread()开启一个线程,那么就会大量的消耗CPU的资源,导致Android运行变慢,甚至OOM(out of memory) ,因而
java就出现了一个ThreadPoolExecutor来管理这些线程。控制最多的线程数maximumPoolSize,
核心线程数corePoolSize,来管理我们需要开启的线程数。目的:减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
所以:我们就可以根据手机的CPU核数来控制
App可以开的最大线程数。保证程序的合理运行
创建线程池对象
线程池几个参数的理解:
比如去火车站买票, 有10个售票窗口, 但只有5个窗口对外开放. 那么对外开放的5个窗口称为核心线程数
corePoolSize,而最大线程数
maximumPoolSize是10个窗口.如果5个窗口都被占用, 那么后来的人就必须在后面排队, 但后来售票厅人越来越多, 已经人满为患, 就类似于线程队列
new LinkedBlockingQueue<Runnable>()已满.- 这时候火车站站长下令, 把剩下的5个窗口也打开, 也就是目前已经有10个窗口同时运行. 后来又来了一批人,
- 10个窗口也处理不过来了, 而且售票厅人已经满了, 这时候站长就下令封锁入口,不允许其他人再进来, 这就是线程异常处理策略.
- 而线程存活时间
keepAliveTime指的是, 允许售票员休息的最长时间, 以此限制售票员偷懒的行时间。休息一下在处理。
单列的模式创建线程池ThreadPoolExecutor
public static class ThreadPool
{
public static ThreadPoolExecutor executor = null;
private int corePoolSize;
private int maximumPoolSize;
private long keepAliveTime = 0; // 限制线程的的最大存活时间
public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime)
{
super();
this.corePoolSize = corePoolSize; //核心线程数
this.maximumPoolSize = maximumPoolSize; //最大线程 ,当核心线程用完时。决定是否开启最大线程
this.keepAliveTime = keepAliveTime; //线程排队时间,
}
/**
* 线程池:就是把一堆线程放在一起来管理。 1.通过一定的管理机制。来处理线程额执行顺序 2.管理最多可以同时执行的线程数。
* 3.其他线程通过队列的形式,也就是排队的形式来管理线程的并发数。
*
* @param runnable
*/
public void execute(Runnable runnable)
{
if (runnable == null)
{
return;
}
if (executor == null)
{
executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.MILLISECONDS,// 时间单位
new LinkedBlockingQueue<Runnable>(),// 线程队列
Executors.defaultThreadFactory(),//线程工厂
new AbortPolicy());
}
// 给线程池里面添加一个线程
executor.execute(runnable);
}
创建线程池管理者 ThreadManager
通过给线程加锁机制。来保证线程安全,以及当前程序当中只有一个x线程池
ThreadPool
/**
* 线程管理者。
*
* @author H_lang
*
*/
public class ThreadManager
{
private static ThreadPool threadPool; // 单列的线程池对象。
/**
* 单列,线程安全
* 获取一个线程池对象
* @return
*/
public static ThreadPool getThreadPool()
{
if (threadPool == null)
{
//枷锁
synchronized (ThreadManager.class)
{
if (threadPool == null)
{
//核心线程数,等于处理器个数乘2
int corePoolSize = Runtime.getRuntime().availableProcessors()*2;
int maximumPoolSize = 10;
long keepAliveTime = 0L;
threadPool = new ThreadPool(corePoolSize, maximumPoolSize, keepAliveTime);
}
}
}
return threadPool;
}
public static class ThreadPool
{
public static ThreadPoolExecutor executor = null;
private int corePoolSize;
private int maximumPoolSize;
private long keepAliveTime = 0; // 限制线程的的最大存活时间
public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime)
{
super();
this.corePoolSize = corePoolSize; //核心线程数
this.maximumPoolSize = maximumPoolSize; //最大线程 ,当核心线程用完时。决定是否开启最大线程
this.keepAliveTime = keepAliveTime; //线程排队时间,
}
/**
* 线程池:就是把一堆线程放在一起来管理。 1.通过一定的管理机制。来处理线程额执行顺序 2.管理最多可以同时执行的线程数。
* 3.其他线程通过队列的形式,也就是排队的形式来管理线程的并发数。
*
* @param runnable
*/
public void execute(Runnable runnable)
{
if (runnable == null)
{
return;
}
if (executor == null)
{
executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.MILLISECONDS,// 时间单位
new LinkedBlockingQueue<Runnable>(),// 线程队列
Executors.defaultThreadFactory(),//线程工厂
new AbortPolicy());
}
// 给线程池里面添加一个线程
executor.execute(runnable);
}
}
}
android线程池ThreadPoolExecutor的理解的更多相关文章
- Android线程池ThreadPoolExecutor
阿里巴巴Android开发手册[强制]新建线程时,必须通过线程池提供(AsyncTask 或者 ThreadPoolExecutor或者其他形式自定义的线程池),不允许在应用中自行显式创建线程说明:使 ...
- Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用演示样例
MainActivity例如以下: package cc.vv; import java.util.concurrent.LinkedBlockingQueue; import java.util.c ...
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android(java)学习笔记211:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Java: 线程池(ThreadPoolExecutor)中的参数说明
最近在看<阿里巴巴Android开发手册>,里面有这样几句话: [强制]新建线程时,必须通过线程池提供(AsyncTask 或者ThreadPoolExecutor或者其他形式自定义的线程 ...
- Android 线程池概念及使用
一:使用线程池的原因 在android开发中经常会使用多线程异步来处理相关任务,而如果用传统的newThread来创建一个子线程进行处理,会造成一些严重的问题: 在任务众多的情况下,系统要为每一个任务 ...
- java线程池ThreadPoolExecutor使用简介
一.简介线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize, int m ...
- 关于线程池ThreadPoolExecutor使用总结
本文引用自: http://blog.chinaunix.net/uid-20577907-id-3519578.html 一.简介 线程池类为 java.util.concurrent.Thread ...
随机推荐
- vs2010 和 svn的结合运用,svn的安装
转自:http://www.cnblogs.com/joeylee/archive/2012/10/08/2715142.html 1:svn的安装,如何在vs2010里面添加 svn的插件呢? 在这 ...
- Entity Framework 杂碎
其实看图很简单,database first和model first都是通过 data model创建的edmx文件,只不过model first模块可以自己根据需要创建和修改实体,显得更加灵活. c ...
- sql执行计划
http://www.cnblogs.com/kissdodog/p/3160560.html
- CF_402B 想法题
题目链接:http://codeforces.com/problemset/problem/402/B /**算法分析: 题意太大意,positive没注意这个问题 考察等差数列,由An=A1+(n- ...
- HTML 网页游戏 2048
新手只会一点html和css,javascript基本不会,更别提jQuery了= = 跟着慕课网的教学视频(视频地址:http://www.imooc.com/learn/76)一点点做的,由于自己 ...
- DATASNAP倒底能承受多大的负载能力
DATASNAP是针对企业数据中间件市场而推出来的产品,如果在其它领域用它可能就不会合适. DATASNAP通信使用INDY10,INDY是阻塞型SOCKET. 1.如果使用TCP/IP长连接,DAT ...
- POJ3155 Hard Life
Time Limit: 8000MS Memory Limit: 65536K Total Submissions: 8482 Accepted: 2461 Case Time Limit: ...
- C#- 布署WinForm程序
1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定.(详细见下图) ,此主题相关图片如下: 2:安装向导 关闭后打开 ...
- $.post()请求 ation请求,jsp获取的处理结果
public void write(String content, String charset) { getHttpResponse().setCharacterEncoding(charset); ...
- 动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数
动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数, 在很多场景下,我们需要在动态加载JS文件的时候,根据加载的状态来进行后续的操作,需要在JS加载成功后,执行另一方法,这个方法是依托在加 ...