当前位置:编程学堂 > 【第40期】聊聊线程池内部工作原理

【第40期】聊聊线程池内部工作原理

  • 发布:2023-10-05 03:04

May 17, 2022 3:45 pm • 面试问题 • 阅读 6 点击上方“Java面试题精选”,关注公众号 面试时画图,查漏补缺 >>额外编号:以前的面试题,10道为单位,放在这个公众号菜单栏->面试题中。有需要的欢迎您浏览。 随着CPU核心数量的增加,不可避免地要采用多线程技术来充分利用其计算能力。因此,多线程技术是服务器端开发人员必须掌握的技术。 线程的创建和销毁涉及到系统调用,会消耗系统资源,因此引入线程池技术来避免频繁的线程创建和销毁。 Java中有一个Executors工具类可以为我们创建线程池。它的本质是创建一个新的Thread PoolExecutor对象。线程池几乎是面试中必答的问题。本节结合源码谈谈ThreadExecutor的工作原理 1.线程池创建 我们先来看看Thread的PoolExecutor参数最全的构造方法: corePoolSize:线程池中核心线程的数量。说白了,即使线程池里没有任务,也会有 corePoolSize 的线程等待任务。 MaximumPoolSize:最大线程数。无论提交多少个任务,线程池中的最大工作线程数都是maximumPoolSize。 keepAliveTime:线程生存时间。当线程池中的线程数大于corePoolSize时,如果等待keepAliveTime后没有任务执行,则线程退出。 unit:用于指定keepAliveTime的单位,如秒:TimeUnit.SECONDS。 workQueue:一个阻塞队列,提交的任务会被放到这个队列中。 threadFactory:线程工厂,用于创建线程,主要是为线程命名。默认工厂线程名称为:pool-1-thread-3。 handler:拒绝策略,当线程池中的线程耗尽且队列已满时会被调用。 以上是创建线程池时使用的参数。面试官在面试的时候经常会问这个问题。 2.线程池执行流程 下面用一张图来说明线程池的执行过程。当一个任务提交到线程池时,会首先判断当前线程数是否小于corePoolSize。如果小于,就会创建一个线程来执行提交的任务。否则,任务将被放入workQueue队列中。如果workQueue已满,则会判断当前线程数是否小于maximumPoolSize。如果小于,将创建一个线程来执行任务,否则将调用处理程序,表明线程池拒绝接收该任务。 这里我们以jdk1.8.0_111的源码为例来看看具体的实现。 1.首先看线程池的执行器方法 判断当前活动线程数是否小于corePoolSize。如果小于,则调用addWorker创建一个线程来执行任务。 如果不小于corePoolSize,则将任务添加到workQueue队列中。 如果未能放入workQueue,则创建一个线程来执行该任务。如果此时线程创建失败(当前线程数不小于maximumPoolSize时),则会调用reject(内部调用handler)拒绝接受任务。 2、我们看一下addWorker的方法实现 这段代码是创建非核心线程时,即core等于false。判断当前线程数是否大于等于maximumPoolSize。如果大于等于maximumPoolSize,则返回false,即上面所说的③创建线程失败。 addWorker方法的后半部分: 创建一个 Worker 对象也会实例化一个 Thread 对象。 启动这个线程 3、进入Worker查看其实现。 可以看到创建Worker创建线程时调用了threadFactory。上面②中启动一个线程,会触发该线程调用Worker的run方法。 4、接下来我们看一下runWorker方法的逻辑 当线程调用runWoker时,会在while循环中调用getTask方法从workerQueue中读取任务,然后执行任务。只要getTask方法不返回null,这个线程就不会退出。 5、最后我们看一下getTask方法的实现。 让我们忽略allowCore ThreadTimeOut。该变量的默认值为 false。 wc>corePoolSize 判断当前线程数是否大于corePoolSize。如果当前线程数大于corePoolSize,则会调用workQueue的poll方法获取任务,超时时间为keepAliveTime。如果超过了keepAliveTime并且poll返回null,则上面提到的while序列将退出并且线程将完成。 如果当前线程数小于corePoolSize,则会调用workQueue的take方法来阻塞当前线程。 来源:www.sychzs.cn/qingquanzi/p/8146638.html 最后三期 【第37期】请详细讲解类加载流程、类加载机制以及自定义类加载器 【第38期】tcp和http面试指南,常见考点全给你 【第39期】Mybatis面试18题,你想知道的都在这里! 而不是在网上搜索问题?还不赶快关注我们吧~ 版权声明:本文内容由网友自愿贡献,本文所表达的观点仅代表作者自己的观点。本网站仅提供信息存储空间服务,不拥有任何所有权,也不承担相关法律责任。如果您发现本站有任何涉嫌侵权/非法内容,请发送邮件举报。一经核实,该网站将立即删除。 本文由斑马博客整理。本文链接为:https://www.sychzs.cn/index.php/post/6664.html

相关文章

最新资讯