计算机系统应用教程网站

网站首页 > 技术文章 正文

20篇Java线程池核心学习资料及总结

btikc 2024-10-22 10:32:19 技术文章 12 ℃ 0 评论
  • 难度:中级
  • 开发语言:Java
  • 学习时间:10分钟

学习资料及总结

Java线程池核心(一):ThreadPoolExecutor的基本功能

  • Executor 接口提供了执行 Runnable 任务的功能。
  • ExecutorService 接口提供了关闭线程池、提交任务的功能。
  • AbstractExecutorService 提供了线程池部分功能的公共实现。
  • ThreadPoolExecutor 是线程池的完全实现。
  • Future 提供了获取任务结果、取消任务、查询任务状态的功能。

Java线程池核心(二):ThreadPoolExecutor初始化过程

  • ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
  • corePoolSize:线程池中的核心线程数。
  • maximumPoolSize:线程池中允许的最大线程数。
  • keepAliveTime:空闲线程存活时间。
  • unitkeepAliveTime时间单位。
  • workQueue:工作队列。
  • threadFactory:线程工厂。
  • handler:任务拒绝策略。

Java线程池核心(三):ThreadPoolExecutor最大线程数

  • 在线程池中,用 maximumPoolSize 来表示允许的最大线程数。
  • int getMaximumPoolSize() 获取最大线程数。
  • void setMaximumPoolSize(int maximumPoolSize) 设置最大线程数。
  • 最大线程数直接影响的是添加新线程
  • 在添加新线程时,如果为核心线程时,就跟核心线程数比;如果为非核心线程时,就跟最大线程数比。

Java线程池核心(四):ThreadPoolExecutor核心线程数

  • 在线程池中,用 corePoolSize 来表示允许的最大线程数。
  • int getCorePoolSize() 获取核心线程数。
  • void setCorePoolSize(int corePoolSize) 设置核心线程数。
  • 在设置核心线程数时,不仅仅只设置一个值而已,还补充了所需的核心线程
  • 当线程池在执行任务的时候,如果当前线程池中的线程数比核心线程数少,那么就往线程池中添加一个核心线程

Java线程池核心(五):别让多余的空闲线程还占用着内存空间

  • long getKeepAliveTime(TimeUnit unit)获取空闲线程存活时间。
  • void setKeepAliveTime(long time, TimeUnit unit)设置空闲线程时间。
  • void interruptIdleWorkers()中断所有空闲线程。
  • void interruptIdleWorkers(boolean onlyOne)中断空闲线程,如果 onlyOnetrue,则最多只中断一个线程,否则中断所有空闲线程

Java线程池核心(六):移除空闲的核心线程

  • allowCoreThreadTimeOut 表示是否允许清除空闲的核心线程,即线程池中空闲的核心线程在 keepAliveTime 时间内没有执行任务的话就会被清除。
  • boolean allowsCoreThreadTimeOut()获取是否允许清除空闲的核心线程。
  • void allowCoreThreadTimeOut(boolean value)设置是否允许清除空闲的核心线程。
  • 线程池默认不清除空闲的核心线程。

Java线程池核心(七):线程池中的各种线程数

  • 线程池中一共有 5 种线程数:允许的最大线程数核心线程数当前线程数自线程池创建以来出现过的最大线程数正在工作的线程数
  • int getMaximumPoolSize()允许的最大线程数。
  • int getCorePoolSize()返回核心线程数。
  • int getPoolSize()返回当前线程数。
  • int getLargestPoolSize()返回自线程池创建以来出现过的最大线程数。
  • int getActiveCount()返回正在工作的线程数。
  • 线程池中有各种各样的线程数,它们都只有一个作用,那就是监控线程池

Java线程池核心(八):从源码角度看shutdown方法做了什么

  • void shutdown() 关闭线程池,继续执行完未完成的任务,不再接收新任务。

Java线程池核心(九):从源码角度看shutdownNow方法做了什么

  • List<Runnable> shutdownNow() 立即关闭线程池,返回未执行的任务,不再接收新任务。

Java线程池核心(十):从源码上分析shutdown与shutdownNow区别

  • void shutdown() 将线程池状态设置为 SHUTDOWNList<Runnable> shutdownNow() 将线程池状态设置为 STOP
  • void shutdown() 中断所有空闲线程;List<Runnable> shutdownNow() 中断所有线程,包括正在工作的线程。
  • void shutdown() 不返回未执行的任务;List<Runnable> shutdownNow() 返回未执行的任务。

Java线程池核心(十一):线程池状态

  1. RUNNING:线程池正常运行。
  2. SHUTDOWN:调用 shutdown 方法后,将线程池状态设置为此值,所有空闲线程都将被中断不再接收新任务,也不再添加新线程
  3. STOP:调用 shutdownNow 方法后,将线程池状态设置为此值,所有线程都将被中断不再接收新任务,也不再添加新线程
  4. TIDYING:线程池处于此状态时,任务队列为空线程数为 0
  5. TERMINATED:线程池处于此状态时,表示线程池已关闭

Java线程池核心(十二):提交任务后做了什么?

  1. 判断任务是否为 null,如果为 null,则抛出异常。
  2. RunnableCallable 转换为 RunnableFutrue
  3. 执行任务。
  4. 返回 RunnableFutrue

Java线程池核心(十三):线程池是如何添加线程的?

  • boolean addWorker(Runnable firstTask, boolean core) 方法的作用是向线程池中添加线程。

Java线程池核心(十四):线程池是如何拒绝任务的?

  • 线程池拒绝任务是通过 void reject(Runnable command) 方法来完成的。
  • 任务拒绝策略一共有四种:AbortPolicyDiscardPolicyDiscardOldestPolicyCallerRunsPolicy
  • AbortPolicy策略:始终抛出 RejectedExecutionException 异常。
  • DiscardPolicy策略:什么也不做。
  • DiscardOldestPolicy策略:当线程池还在运行时,抛弃处于任务队列头部的任务,添加被拒绝的任务。
  • CallerRunsPolicy策略:使用调用者线程直接执行被拒绝的任务。

Java线程池核心(十五):工作线程Worker

  • Worker 类主要维护了要执行的任务执行任务的线程

Java线程池核心(十六):任务是如何被执行的?

  • void runWorker(Worker w) 方法的作用就是反复从任务队列中获取任务并执行任务。

Java线程池核心(十七):任务是如何获取的?

  • Runnable getTask() 方法的作用是从任务队列中获取任务。

Java线程池核心(十八):各种任务数

  • long getCompletedTaskCount() 方法获取线程池已完成的任务总数。
  • long getTaskCount() 方法获取线程池任务总数。
  • BlockingQueue<Runnable> getQueue() 方法获取线程池任务队列。

Java线程池核心(十九):清除任务队列中所有已取消的任务

  • void purge() 方法的作用是清除任务队列中所有已取消的任务。

Java线程池核心(二十):随时补充核心线程

  • boolean prestartCoreThread() 方法的作用是补充一个核心线程。
  • int prestartAllCoreThreads() 方法的作用是补满核心线程,返回新增的核心线程数。

答疑

如果大家有任何疑问,请在下方留言或评论。

下一章

Java集合基础

学习小组

加入同步学习小组,共同交流与进步。

欢迎加入“人人都是程序员”编程圈子,与圈友一起交流讨论。

(此处已添加圈子卡片,请到今日头条客户端查看)

版权声明

原创不易,未经允许不得转载!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表