欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 线程池

程序员文章站 2023-12-31 18:28:16
在 java 开发中经常需要执行一些“规格化”的任务,此时可以使用 java 线程池。节省创建线程时间,任务来时即可执行,高效。 java 包是 java.util.concurrent 。创建线程池的常用方法 如果对线程池有更细粒度的控制要求,可以使用 ThreadPoolExecutor 完整的 ......

在 java 开发中经常需要执行一些“规格化”的任务,此时可以使用 java 线程池。节省创建线程时间,任务来时即可执行,高效。

java 包是 java.util.concurrent 。创建线程池的常用方法

executors.newcachedthreadpool()
executors.newfixedthreadpool()
executors.newsinglethreadexecutor()
executors.newcachedthreadpool()

如果对线程池有更细粒度的控制要求,可以使用 threadpoolexecutor 完整的构造方法参数如下

threadpoolexecutor(int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,blockingqueue<runnable> workqueue,threadfactory threadfactory,rejectedexecutionhandler handler)

各个参数的含义如下

  • corepoolsize(线程池基本大小):当向线程池提交一个任务时,若线程池已创建的线程数小于corepoolsize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corepoolsize时,才会根据是否存在空闲线程,来决定是否需要创建新的线程。除了利用提交新任务来创建和启动线程(按需构造),也可以通过 prestartcorethread() 或 prestartallcorethreads() 方法来提前启动线程池中的基本线程。

 

  • maximumpoolsize(线程池最大大小):线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumpoolsize,则线程池会创建新的线程来执行任务。另外,对于*队列,可忽略该参数。

 

  • keepalivetime(线程存活保持时间):默认情况下,当线程池的线程个数多于corepoolsize时,线程的空闲时间超过keepalivetime则会终止。但只要keepalivetime大于0,allowcorethreadtimeout(boolean) 方法也可将此超时策略应用于核心线程。另外,也可以使用setkeepalivetime()动态地更改参数。

 

  • unit(存活时间的单位):时间单位,分为7类,从细到粗顺序:nanoseconds(纳秒),microseconds(微妙),milliseconds(毫秒),seconds(秒),minutes(分),hours(小时),days(天);

 

  • workqueue(任务队列):用于传输和保存等待执行任务的阻塞队列。可以使用此队列与线程池进行交互:

java 线程池

 

 

  • threadfactory(线程工厂):用于创建新线程。由同一个threadfactory创建的线程,属于同一个threadgroup,创建的线程优先级都为thread.norm_priority,以及是非守护进程状态。threadfactory创建的线程也是采用new thread()方式,threadfactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号);

 

  • handler(线程饱和策略):当线程池和队列都满了,执行阻塞时执行该方法,表明该线程池已达饱和状态。
    threadpoolexecutor.abortpolicy:处理程序遭到拒绝,则直接抛出运行时异常rejectedexecutionexception。(默认策略)
    threadpoolexecutor.callerrunspolicy:调用者所在线程来运行该任务,此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
    threadpoolexecutor.discardpolicy:无法执行的任务将被丢弃。
    threadpoolexecutor.discardoldestpolicy:如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重新尝试执行任务(如果再次失败,则重复此过程)。

 

 

 

 

参考文献:

https://blog.csdn.net/z_s_z2016/article/details/81674893

https://blog.csdn.net/wtopps/article/details/80682267

 

上一篇:

下一篇: