Java线程池

  • Executor:执行者,顶层接口
  • ExecutorService:接口API
  • ThreadFactory:线程工厂
  • Executors:工具类,创建线程

创建线程池

​ 使用ThreadPoolExecutor可创建线程池

  • corePoolSize:核心线程数。
  • maximumPoolSize:最大线程数。
  • keepAliveTime:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
  • unit:keepAliveTime 参数的时间单位。
  • workQueue:执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。
  • threadFactory:执行程序创建新线程时使用的工厂。
  • handler:由于超出线程范围和队列容量而使执行被阻塞时所使用的拒绝策略。

缓冲队列

  • ArrayBlockingQueue:规定大小的BlockingQueue,其构造必须指定大小。其所含的对象是FIFO(先进先出)顺序排序的。
  • LinkedBlockingQueue:大小不固定的BlockingQueue,若其构造时指定大小,生成的BlockingQueue有大小限制,不指定大小,其大小有Integer.MAX_VALUE来决定。其所含的对象是FIFO顺序排序的。
  • PriorityBlockingQueue:类似于LinkedBlockingQueue,但是其所含对象的排序不是FIFO,而是依据对象的自然顺序或者构造函数的Comparator决定。
  • SynchronizedQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成。

拒绝策略

  • ThreadPoolExecutor.AbortPolicy:当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常(默认)。

  • ThreadPoolExecutor.DiscardPolicy:当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。

  • ThreadPoolExecutor.DiscardOldestPolicy:当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。

  • ThreadPoolExecutor.CallerRunsPolicy:当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread中处理被拒绝的任务(由调用线程/提交任务的线程处理该任务)。

常用线程池

​ 在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

  1. newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
  2. newFixedThreadPool(常用):创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。注意点:newFixedThreadPool的缓冲队列为LinkedBlockingQueue,LinkedBlockingQueue的队列大小为Integer.MAX_VALUE。
  3. newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。注意点:没有控制线程数,线程处理过慢时会导致OOM。
  4. newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

创建固定线程池经验

​假设系统核心数为N

  • 如果时CPU密集型应用,则线程池大小设置为N或N+1。
  • 如果时IO密集型应用,则线程池大小设置为2N或2N+2。

__EOF__

本文作者Justin
本文链接https://www.cnblogs.com/justinxiao/p/17257370.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   justin_xiao  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示