JAVA的Executors源码:(可以看出底层都是通过ThreadPoolExecutor来具体设置的~)
  1. public static ExecutorService newCachedThreadPool() {
  2. return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
  3. 60L, TimeUnit.SECONDS,
  4. new SynchronousQueue<Runnable>());
  5. }

  

  1. public static ExecutorService newFixedThreadPool(int nThreads){
  2. returnnewThreadPoolExecutor(nThreads, nThreads,
  3. 0L,TimeUnit.MILLISECONDS,
  4. newLinkedBlockingQueue<Runnable>());
  5. }

  

  1. public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory){
  2. returnnewFinalizableDelegatedExecutorService
  3. (newThreadPoolExecutor(1,1,
  4. 0L,TimeUnit.MILLISECONDS,
  5. newLinkedBlockingQueue<Runnable>(),
  6. threadFactory));
  7. }

  

  1. public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize){
  2. returnnewScheduledThreadPoolExecutor(corePoolSize);
  3. }

  

(ScheduledThreadPoolExecutor  :extends ThreadPoolExecutor , implements ScheduledExecutorService)
 

ThreadPoolExecutor自定义

以上是一些JAVA封装现成设置后得到的线程池,更灵活的自定义设置:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
 
 
ThreadPoolExecutor提供了一系列参数来配置线程池,通过不同的参数可以创建不同的线程池:
1.corePoolSize:核心线程数,默认情况下,核心线程会在线程中一直存活;
2.maximumPoolSize:最大线程数,当活动线程数达到这个数值后,后续的任务将会被阻塞;
3.keepAliveTime:非核心线程闲置时的超时时长,超过这个时长,闲置的非核心线程就会被回收;
4.unit:用于指定keepAliveTime参数的时间单位,有TimeUnit.MILLISECONDSTimeUnit.SECONDSTimeUnit.MINUTES等;
5.workQueue:任务队列,通过线程池的execute方法提交的Runnable对象会存储在这个参数中;
6.threadFactory:线程工厂,为线程池提供创建新线程的功能。它是一个接口,它只有一个方法Thread newThread(Runnable r)
7.RejectedExecutionHandler:当线程池无法执行新任务时,可能是由于任务队列已满或者是无法成功执行任务,这个时候就会调用这个Handler的rejectedExecution方法来通知调用者,默认情况下,rejectedExecution会直接抛出个rejectedExecutionException
 
ThreadPoolExecutor执行任务的规则:
1.如果线程池中的线程数未达到核心线程的数量,那么会直接启动一个核心线程来执行任务;
2.如果线程池中的线程数量已经达到或者超过核心线程的数量,那么任务会被插入到任务队列中排队等待执行;
3.如果在步骤2中无法将任务插入到的任务队列中,可能是任务队列已满,这个时候如果线程数量没有达到规定的最大值,那么会立刻启动非核心线程来执行这个任务;
4.如果步骤3中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandlerrejectedExecution方法来通知调用者。
 
使用示例:
自定义线程池工厂类:
  1. public final class ThreadUtils {
  2. private static final String TAG = ThreadUtils.class.getSimpleName();
  3.  
  4. //线程池为无限大,复用线程,灵活回收空闲线程
  5. // name:线程名字
  6. public static ThreadPoolExecutor newCachedThreadPool(final String name) {
  7. return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
  8. 60L, TimeUnit.SECONDS,
  9. new SynchronousQueue<Runnable>(),
  10. new CounterThreadFactory(name),
  11. new LogDiscardPolicy());
  12. }
  13.  
  14. //定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
  15. //name:线程名字, nThread:线程数
  16. public static ThreadPoolExecutor newFixedThreadPool(final String name, int nThreads) {
  17. return new ThreadPoolExecutor(nThreads, nThreads,
  18. 0L, TimeUnit.MILLISECONDS,
  19. new LinkedBlockingQueue<Runnable>(),
  20. new CounterThreadFactory(name),
  21. new LogDiscardPolicy());
  22. }
  23.  
  24. //创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
  25. //name:线程名字
  26. public static ThreadPoolExecutor newSingleThreadExecutor(final String name) {
  27. return newFixedThreadPool(name, 1);
  28. }
  29.  
  30. //创建一个定长线程池,支持定时及周期性任务执行。
  31. /*使用:
  32. scheduledThreadPool.schedule(new Runnable() {
  33. @Override
  34. public void run() {
  35. System.out.println("delay 3 seconds");
  36. }
  37. }, 3, TimeUnit.SECONDS); //表示延迟3秒执行。
  38. */
  39. public static ScheduledExecutorService newScheduledExecutorService(int nThreads){
  40. return Executors.newScheduledThreadPool(nThreads);
  41. }
  42.  
  43. public static class LogDiscardPolicy implements RejectedExecutionHandler {
  44.  
  45. public LogDiscardPolicy() {
  46. }
  47.  
  48. public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
  49. LogUtils.v(TAG, "rejectedExecution() " + r + " is discard.");
  50. }
  51. }
  52.  
  53. public static class CounterThreadFactory implements ThreadFactory {
  54. private int count;
  55. private String name;
  56.  
  57. public CounterThreadFactory(String name) {
  58. this.name = (name == null ? "Android" : name);
  59. }
  60.  
  61. @Override
  62. public Thread newThread(Runnable r) {
  63. Thread thread = new Thread(r);
  64. thread.setName(name + "-thread #" + count++);
  65. return thread;
  66. }
  67. }
  68. }

  

 

Java(Android)线程池 总结的更多相关文章

  1. Java(Android)线程池

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

  2. Java(Android)线程池zz

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

  3. Java(Android)线程池[转]

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

  4. Java(Android)线程池妙用

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

  5. java/android线程池详解

    一,简述线程池: 线程池是如何工作的:一系列任务出现后,根据自己的线程池安排任务进行. 如图: 线程池的好处: 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销. 能有效控制线程池的最大并 ...

  6. android 线程池的使用

    转自http://www.trinea.cn/android/java-android-thread-pool/ Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的 ...

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

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

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

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

  9. android线程池ThreadPoolExecutor的理解

    android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...

随机推荐

  1. 4537: [Hnoi2016]最小公倍数

    Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值.所有权值都可以分解成2^a*3^b的形式.现在有q个询问,每次询问给定四个参数u.v.a和b,请你 ...

  2. 业界良心:Square开源Viewfinder,25万行代码全公布!

    http://www.csdn.net/article/2014-05-06/2819633-square-open-sources-viewfinder https://github.com/vie ...

  3. mmap内存映射复习

    c语言初学时,比较常见的一个习题就是实现cp. 使用c库实现的cp就不赘述了. 最近工作用到内存映射,就拿来练下手,复习一下mmap的用法. 很简单,将目标文件和源文件映射到内存,然后使用memcpy ...

  4. OpenCV for c++Builder

    整理日: 20154/6 Borland C++BuilderでOpenCVを使う 確認 Turbo C++ 2007/03 1. ダウンロード&インストール http://sourcefor ...

  5. JDK的帮助文档

    1.JDK1.8在线api,英文版 https://docs.oracle.com/javase/8/docs/api/

  6. Coursera《machine learning》--(2)单变量线性回归(Linear Regression with One Variable)

    本笔记为Coursera在线课程<Machine Learning>中的单变量线性回归章节的笔记. 2.1 模型表示 参考视频: 2 - 1 - Model Representation ...

  7. 如何使用GCD(ZZ)

    什么是GCD?       Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4 ...

  8. 【转】Android Listener侦听的N种写法

    原文网址:http://blog.csdn.net/ithomer/article/details/7489274 Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种 ...

  9. 【转】vc中使用SendMessage正确发送自定义消息的方法--不错

    原文网址:http://zhoumf1214.blog.163.com/blog/static/5241940200910265532959/ 最近在用VC2008做开发,后来由于要用到消息的发送,而 ...

  10. python for selenium 数据驱动测试

    # -*- coding:utf-8 -*- """ 数据驱动测试,从 csv 文件中读取数据 """ from selenium impo ...