android线程池ThreadPoolExecutor的理解

线程池

我自己理解看来。线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable,
注意:每一个线程都是需要CPU分配资源去执行的。

如果由于总是new Thread()开启一个线程,那么就会大量的消耗CPU的资源,导致Android运行变慢,甚至OOM(out of memory) ,

因而java就出现了一个ThreadPoolExecutor来管理这些线程。控制最多的线程数maximumPoolSize
核心线程数corePoolSize,来管理我们需要开启的线程数。

目的:减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务

所以:我们就可以根据手机CPU核数来控制App可以开的最大线程数。保证程序的合理运行

创建线程池对象

线程池几个参数的理解:
  1. 比如去火车站买票, 有10个售票窗口, 但只有5个窗口对外开放. 那么对外开放的5个窗口称为核心线程数corePoolSize,

  2. 而最大线程数maximumPoolSize是10个窗口.

  3. 如果5个窗口都被占用, 那么后来的人就必须在后面排队, 但后来售票厅人越来越多, 已经人满为患, 就类似于线程队列new LinkedBlockingQueue<Runnable>()已满.

  4. 这时候火车站站长下令, 把剩下的5个窗口也打开, 也就是目前已经有10个窗口同时运行. 后来又来了一批人,
  5. 10个窗口也处理不过来了, 而且售票厅人已经满了, 这时候站长就下令封锁入口,不允许其他人再进来, 这就是线程异常处理策略.
  6. 而线程存活时间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的理解的更多相关文章

  1. Android线程池ThreadPoolExecutor

    阿里巴巴Android开发手册[强制]新建线程时,必须通过线程池提供(AsyncTask 或者 ThreadPoolExecutor或者其他形式自定义的线程池),不允许在应用中自行显式创建线程说明:使 ...

  2. Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用演示样例

    MainActivity例如以下: package cc.vv; import java.util.concurrent.LinkedBlockingQueue; import java.util.c ...

  3. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  4. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  5. Android(java)学习笔记211:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  6. Java: 线程池(ThreadPoolExecutor)中的参数说明

    最近在看<阿里巴巴Android开发手册>,里面有这样几句话: [强制]新建线程时,必须通过线程池提供(AsyncTask 或者ThreadPoolExecutor或者其他形式自定义的线程 ...

  7. Android 线程池概念及使用

    一:使用线程池的原因 在android开发中经常会使用多线程异步来处理相关任务,而如果用传统的newThread来创建一个子线程进行处理,会造成一些严重的问题: 在任务众多的情况下,系统要为每一个任务 ...

  8. java线程池ThreadPoolExecutor使用简介

    一.简介线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize, int m ...

  9. 关于线程池ThreadPoolExecutor使用总结

    本文引用自: http://blog.chinaunix.net/uid-20577907-id-3519578.html 一.简介 线程池类为 java.util.concurrent.Thread ...

随机推荐

  1. 终极秘籍教你怎么找回被盗iPhone 查询ICCID

    iPhone不慎丢失后怎么办?普通青年:立刻报警,基本没用.文艺青年:用Find my iPhone查找位置.但那只是个大概位置,iPhone关机后更是没戏,接着是用iCloud锁定手机,发送警告信息 ...

  2. CodeForcesGym 100753B Bounty Hunter II 二分图最小路径覆盖

    关键在建图 题解:http://www.cnblogs.com/crackpotisback/p/4856159.html 学习:http://www.cnblogs.com/jackiesteed/ ...

  3. 使用 testng.xml 参数化

    1. 创建 Java 测试类 2. 添加测试方法 TestngParameterTest(String name, String age) 3. 为测试方法添加注释 @Parameters({&quo ...

  4. [codevs1073]家族

    题目描述 Description 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和 ...

  5. 2015年9月28日JQuery提前预习预热笔记

    visual studio下载2010 2010与2008不一样,2008需要添加补丁,采用调用对象.2010可以直接用. JQuery=$ 是函数是方法是对象 念J快儿,念doler 开发人员工具( ...

  6. 2013 ACM区域赛长沙 H zoj 3733 (hdu 4798) Skycity

    题意:一个圆台,底面和顶面半径分别为R,r,然后高度为H,一共F层,每层高度一样,然后要在每层的天花板上贴方格玻璃,方格玻璃要满足以下几个条件: 方格玻璃面积不能小于S,且方格玻璃要围成一个正多边形, ...

  7. HW5.22

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  8. How to change pager CSS in CGridView CListView in Yii

    类手册: http://www.yiiframework.com/doc/api/1.1/CLinkPager 其它参考: http://capstone3.blogspot.com/2012/06/ ...

  9. windows进程间通信 .

    摘 要: 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microso ...

  10. tomcat配置多个web网站的配置详解

    假如只有一台服务器,需要配置多个web网站(端口不同我还没试),该怎么样配置tomcat呢,其实很简单,只需要将tomcat 下面的 server.xml  中增加两个甚至是多个<Host> ...