博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池ThreadPoolExecutor
阅读量:7043 次
发布时间:2019-06-28

本文共 2783 字,大约阅读时间需要 9 分钟。

构造方法

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

参数意义:

coreProolSize:线程池核心线程数

maximumPoolSize:线程池所能容纳的最大线程数

keepAliveTime:非核心线程闲置时的超时时长,超过这个时长,非核心线程就会被回收。当ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true时,keepAliveTime同样会作用于核心线程

unit:用于指定keepAliveTime参数的时间单位,常用的有毫秒、秒、分钟

workQueue:线程池中的任务队列,通过线程池的execute方法提交的Runnable对象会存储在这个参数中

threadFactory:线程工厂,为线程池提供创建新线程的功能,是一个接口,只有一个方法:Thread newThread(Runnable r)

遵循规则:

1)如果线程池中的线程数量未达到核心线程的数量,那么会直接启动一个核心线程来执行任务

2)如果线程池中的线程数量已经达到或者超过核心线程的数量,那么任务会被插入到任务队列中排队等待执行

3)如果在步骤2中无法将任务插入到任务队列中,这往往是由于任务队列已满,这个时候如果线程数量未达到线程池规定的最大值,那么会立刻启动一个非核心线程来执行任务

4)如果步骤3中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandlerrejectedExecution方法来通知调用者(当任务队列已满或无法成功执行任务时调用)

AsyncTask的配置如下

1)核心线程数=CPU核心数+1

2)线程池最大线程数=CPU核心数的2倍+1

3)核心线程无超时机制,非核心线程在闲置时的超时时间为1秒

4)任务队列的容量为128

线程池分类:

1)FixedThreadPool

public static ExecutorService newFixedThreadPool(int nThread){    return new ThreadPoolExecutor(nThreads,                                  nThreads,                                  0L,                                  TimeUnit.MILLISECONDS,                                  new LinkedBlockingQueue
());}

线程数量固定的线程池,只有核心线程,没有超时机制,不会被回收,任务队列没有大小限制

2)CachedThreadPool

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

只有非核心线程,最大线程数为任意大,超时机制为60秒,任务队列相当于一个空集合。此类线程适合执行大量的耗时较少的任务

3)ScheduleThreadPool

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

核心线程数量固定,非核心线程数量没有限制,且超时机制为0,即立刻回收。此类线程主要用于执行定时任务和具有固定周期的重复任务。

4)SingleThreadExecutor

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

内部只有一个核心线程,确保所有任务在同一个线程中按顺序执行。意义在于统一所有的外界任务到一个线程中,使得不需要处理线程同步的问题。

转载地址:http://eeqal.baihongyu.com/

你可能感兴趣的文章
阿里开源的 java 诊断工具—— Arthas
查看>>
编写可读代码的艺术 -- 读书笔记
查看>>
应用程序池配置隔离
查看>>
RHEL 7服务控制
查看>>
工具控
查看>>
网摘-U盘装XP,U盘装Ubuntu
查看>>
DOS符号的问题
查看>>
更换一个国内的yum源
查看>>
我的友情链接
查看>>
python 'import MySQLdb' error on mac
查看>>
我的友情链接
查看>>
编程习惯(C++ Primer中涉及到的)
查看>>
糖尿病人有哪些并收症
查看>>
Mysql Command
查看>>
项目丝绸导航为ASP.NET Web窗体
查看>>
shell脚本编程-循环语句练习
查看>>
STM32学习笔记(2):外部中断的使用
查看>>
友善之臂mini2440使用日志1
查看>>
pageX offsetX screenX clientX-各种X
查看>>
关于企业移动设备安全建议
查看>>