使用线程池的好处:

首先通过线程池中线程的重用减少创建和销毁线程的性能开销。其次,能控制线程池中的并发数,否则会因为大量的线程争夺CPU资源造成阻塞。最后,线程池能够对线程进行管理,比如使用ScheduledThreadPool来设置延迟N秒后执行任务,并且每隔M秒循环执行一次。

 public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)

corePoolSize: 线程池中所保存的核心线程数。线程池初始化启动之后,默认是空的,只有当任务来临之时,才会建立线程 处理请求。当然可以使用prestartCoreThread()方法可以使线程池初始化之后,立即建立corePoolSize个数的线程来等待任务。

maximumPoolSize: 线程池中线程数能达到的最大值。当然这个参数还与workQueue的使用策略有关,当使用无界队列(LinkedBlockQueue等)时,本参数无效。corePoolSize和maximumPoolSize的作用是控制线程池中实际运行线程的数目。例如当新的任务提交到线程池时,假设此时线程池中运行线程的数量为M,当M < corePoolSize时,会新建线程来处理任务;如果M>corePoolSize && M < maximumPoolSize时,如果是workQueue是阻塞队列时,才会创建新的线程来完成任务。如果corePoolSize == maximumPoolSize时,则意味着创建了固定大小的线程池。如果maximumPoolSize为Integer.MAX_VALUE,则可以理解为该线程池适合任意数量的并发任务。

keepAliveTime:当前线程池maximumPoolSize > corePoolSize时,终止(maximumPoolSize - corePoolSize)个空闲线程的时间。也就是说空闲状态下,(maximumPoolSize - corePoolSize)个线程存活的最长时间。

TimeUnit:keepAliveTime参数的时间单位,可以为毫秒,秒,分。。。

BlockingQueue: 任务队列,如果当前线程池中核心线程数达到了corePoolSize时,且当前所有线程都属于活动状态时,则将新的任务添加到该队列中。基本上有以下几个实现:
1) ArrayBlockQueue:基于数组结构的有界队列,此队列按FIFO(first in first out)原则对任务进行排序。如果队列已满,新的任务将会被采取拒绝策略对待。
2)LinkedBlockingQueue: 基于链表的无界队列,按FIFO原则排序。因为是无界的,所以不存在满的情况,此时拒绝策略无效
3) PriorityBlockingQueue:具有优先级的队列的有界队列,可以自定义优先级,默认为自然排序。

Handler:拒绝策略,当线程池和workQueue都满了的情况下,对新任务采取的处理策略,有四种默认实现:
1) AbortPolicy:拒绝任务,且还抛出RejectedExecutionException异常,线程池默认策略
2) CallerRunPolicy:拒绝新任务进入,如果该线程池还没有被关闭,那么这个新的任务在执行线程中被调用
3) DiscardOldestPolicy: 如果执行程序尚未关闭,则位于头部的任务将会被移除,然后重试执行任务(再次失败,则重复该过程),这样将会导致新的任务将会被执行,而先前的任务将会被移除。
4)DiscardPolicy:没有添加进去的任务将会被抛弃,也不抛出异常。基本上为静默模式。

ThreadPoolExecutor的各个参数所代表的特性注释中已经写的很清楚了,那么ThreadPoolExecutor执行任务时的心路历程是什么样的呢?(以下用currentSize表示线程池中当前线程数量)

(1)当currentSize<corePoolSize时,没什么好说的,直接启动一个核心线程并执行任务。

(2)当currentSize>=corePoolSize、并且workQueue未满 时,添加进来的任务会被安排到workQueue中等待执行。

(3)当workQueue已满,但是currentSize<maximumPoolSize时,会立即开启一个非核心线程来执行任务。

(4)当currentSize>=corePoolSize、workQueue已满、并且currentSize>maximumPoolSize时,调用handler默认抛出RejectExecutionExpection异常。

1、FixedThreadPool      (填充式线程池)      只有核心线程,核心线程数固定,不回收不超时(核心线程没有超时机制),任务队列长度不限。(排队吃饭,餐位数量固定)

(适用于任务量比较固定但耗时长的任务)

 public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
}

2、CachedThreadPool  (缓存式线程池)      没有核心线程,非核心线程随时创建,数量最大值为Integer.MAX_VALUE。空闲线程超时回收(60s)(适合执行大量耗时较小的任务)

public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}

3、ScheduledThreadPool               核心线程数量是固定的,而非核心线程是没有限制的,当非核心线程闲置时它会被立即回收(用于执行定时任务和具有固定时期的重复任务),

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
} public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());

4、SingleThreadExecutor  只有一个核心线程,确保所有的任务都在同一个线程中按顺序执行。SingleThreadExecutor的意义在于统一所有外界任务在一个线程中,这使得这些任务之间不需要处理线程同步的问题。(使用于多个任务顺序执行的场景)

public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}

比较如下:

android的四种线程池的更多相关文章

  1. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  2. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

  3. Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void ru ...

  4. JAVA四种线程池实例

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗?   Java   1 2 3 4 5 6 7 new Thread(new Runnable() {        ...

  5. Java 四种线程池的用法分析

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  6. (转载)new Thread的弊端及Java四种线程池的使用

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...

  7. Java ExecutorService四种线程池的例子与说明

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  8. Java 1.ExecutorService四种线程池的例子与说明

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  9. ExecutorService的四种线程池

    转自:https://www.cnblogs.com/zhaoyan001/p/7049627.html 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new ...

随机推荐

  1. ACM__搜素之BFS与DFS

    BFS(Breadth_First_Search) DFS(Depth_First_Search) 拿图来说 BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4, ...

  2. delphi 新版内存表 FDMemTable

    c++builder XE 官方demo最全60多个 http://community.embarcadero.com/blogs?view=entry&id=8761 FireDAC.Com ...

  3. mycat的schema.xml的个人的一点理解

    官方文档里讲的详细的部分的我就不再赘述了,我只是谈谈我自己的理解 刚开始接触mycat,最重要的几个配置文件有server.xml,schema.xml,还有个rule.xml配置文件 具体都是干啥用 ...

  4. 如何遍历List对象

    for(String str : list) {//其内部实质上还是调用了迭代器遍历方式,这种循环方式还有其他限制,不建议使用. System.out.println(str); } .普通for循环 ...

  5. TFS登录时保存了用户密码,如何用其他账户登录

      来源:http://blog.csdn.net/littlegreenfrog/article/details/5254633 使用TFS2008过程中,常常由于已经保存用户名和密码,却没有重新登 ...

  6. 24 week 4 安装 docker

    安装docker 出现问题 解决办法https://blog.csdn.net/VOlsenBerg/article/details/70140211 发现链接超时,然后就https://blog.c ...

  7. windows上使用metastore client java api链接hive metastore问题

    https://github.com/sdravida/hadoop2.6_Win_x64 下载winutils.exe 添加到path中

  8. multi role

    mesos 1.2.0实验性的支持了一个框架多个role. message FrameworkInfo { ... // Roles are the entities to which allocat ...

  9. 使用openshit在ubuntu14.04下一键部署openstack(juno版本)

    一.基本介绍 本实验是在vmware workstation上虚拟机ubuntu14.04(64bit,desktop)上部署openstack(Juno版本).采用的工具是openshit.open ...

  10. jstl-随机数-借用jsp嵌入的代码

    ) %></c:set> ${rand }