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. Nginx实现七层负载均衡配置指导

    本文描述了如何使用Nginx实现在应用层实现7层负载均衡功能,Nginx支持虚拟主机,可以按照轮询,IP哈希,URL哈希,权重方式对后端服务器做负载均衡,还支持后端服务器健康检查功能.废话不多说,详细 ...

  2. [Buffalo] 一些SQL函数

    取得当前时间的函数:GETDATE() 计算时间的函数:DATEADD(datepart,number,date) 计算两个时间差额:DATEDIFF(datepart,startdate,endda ...

  3. 【原】本地win7,远程服务器XP系统,两台机器间不能拖动文件

    (1)网上大部分说是rdpclip.exe(存放在c:/windows/system32)的问题,试了好几次,没有解决 (2)通过第二种方式解决,详细步骤如下所示: 1.点击进入远程连接. 2.选择本 ...

  4. 【HTML】Intermediate6:Text: Addresses, Definitions, Bi-directional, and Editorial

    1.</address> It should be used specifically for the contact details relating either to the ent ...

  5. oracle 创建索引思考(转)

    在Oracle数据库中,创建索引虽然比较简单.但是要合理的创建索引则比较困难了. 笔者认为,在创建索引时要做到三个适当,即在适当的表上.适当的列上创建适当数量的索引.虽然这可以通过一句话来概括优化的索 ...

  6. bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

  7. POJ2299: Ultra-QuickSort-合并排序解决逆序数问题

    #include<iostream> #include<malloc.h> using namespace std; long long ans; void merge(int ...

  8. 恢复oracle中误删除drop掉的表

    查看回收站中表 select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recycl ...

  9. BOM 和 JavaScript 中的 trim

    今天遇到一个 IE7 下 JSON.parse 失败的问题.经过排查发现:服务端某个配置文件编码是 UTF-8 + BOM,输出的字符串最开始包含了 BOM 字符,不是合法的 JSON. IE7 不支 ...

  10. jq问题处理

    1.同一个事件,点击显示和隐藏 $(document).ready(function(){ $('.container .nav-header').click(function(){ var chan ...