专栏首页desperate633Java线程池的工作原理,好处和注意事项

Java线程池的工作原理,好处和注意事项

线程池的工作原理

、 一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行 任务的任务队列(阻塞队列) 。

一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行 任务的任务队列(阻塞队列) 。

默认情况下, 在创建了线程池后, 线程池中的线程数为 0。 当任务提交给 线程池之后的处理策略如下:

  1. 如果此时线程池中的数量小于 corePoolSize(核心池的大小) , 即使线程池中的线程都处于空闲状态, 也要创建新的线程来处理被添加的任务(也就是每来一个任务, 就要创建一个线程来执行任务) 。
  2. 如果此时线程池中的数量大于等于 corePoolSize, 但是缓冲队列workQueue 未满, 那么任务被放入缓冲队列, 则该任务会等待空闲线程将其取出去执行。
  3. 如 果 此 时 线 程 池 中 的 数 量 大 于 等 于 corePoolSize , 缓 冲 队 列workQueue 满, 并且线程池中的数量小于 maximumPoolSize(线程池最大线程数) , 建新的线程来处理被添加的任务。
  4. 如果 此时 线程 池中 的数量 大 于 等 于 corePoolSize, 缓 冲 队列workQueue 满, 并且线程池中的数量等于 maximumPoolSize, 那么通过RejectedExecutionHandler 所指定的策略(任务拒绝策略)来处理此任务。也就是处理任务的优先级为: 核心线程 corePoolSize、 任务队列workQueue、 最大线程 maximumPoolSize, 如果三者都满了, 使用handler 处理被拒绝的任务。

5. 特别注意, 在 corePoolSize 和 maximumPoolSize 之间的线程数会被自动释放。 当线程池中线程数量大于 corePoolSize 时, 如果某线程空闲时间超过 keepAliveTime, 线程将被终止, 直至线程池中的线程数目不大于 corePoolSize。 这样, 线程池可以动态的调整池中的线程数。

使用线程池的好处

  • 1.通过重复利用已创建的线程, 减少在创建和销毁线程上所花的时间以及系统资源的开销。
  • 2.提高响应速度。 当任务到达时, 任务可以不需要等到线程创建就可以立即行。
  • 3.提高线程的可管理性。 使用线程池可以对线程进行统一的分配和监控。
  • 4.如果不使用线程池, 有可能造成系统创建大量线程而导致消耗完系统内存。

线程池的注意事项

虽然线程池是构建多线程应用程序的强大机制, 但使用它并不是没有风险的。 (1) 线程池的大小。 多线程应用并非线程越多越好, 需要根据系统运行的软硬件环境以及应用本身的特点决定线程池的大小。 一般来说, 如果代码结构合理的话, 线程数目与 CPU数量相适合即可。 如果线程运行时可能出现阻塞现象, 可相应增加池的大小; 如有必要可采用自适应算法来动态调整线程池的大小, 以提高 CPU 的有效利用率和系统的整体性能。 (2) 并发错误。 多线程应用要特别注意并发错误, 要从逻辑上保证程序的正确性, 注意避免死锁现象的发生。 (3) 线程泄漏。 这是线程池应用中一个严重的问题, 当任务执行完毕而线程没能返回池中就会发生线程泄漏现象。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java并发之“饥饿”和“公平锁”(Starvation and Fairness)java中发生线程饥饿的原因java中实现公平锁公平锁性能考虑

    如果一个线程的cpu执行时间都被其他线程抢占了,导致得不到cpu执行,这种情况就叫做“饥饿”,这个线程就会出现饥饿致死的现象,因为永远无法得到cpu的执行。解决...

    desperate633
  • 共享资源的线程安全性Local VariablesLocal Object ReferencesObject Member VariablesThe Thread Control Escape Rul

    如果某段代码可以正确的被多线程并发的执行,那么我们就称这段代码是线程安全的,如果一段代码是线程安全的那么他肯定不会出现资源竞速的问题。资源竞速的问题只发生在多个...

    desperate633
  • Java并发之嵌套管程锁死(Nested Monitor Lockout)具体的嵌套管程死锁的例子Nested Monitor Lockout vs. Deadlock

    可以看到,lock()方法首先在”this”上同步,然后在monitorObject上同步。如果isLocked等于false,因为线程不会继续调用monito...

    desperate633
  • Java 并发之线程池学习

    创建 通过ThreadPoolExecutor来创建一个线程池 new ThreadPoolExecutor(corePoolSize, maximumPool...

    一灰灰blog
  • 最全java多线程学习总结1--线程基础

      《java 核心技术》这本书真的不错,知识点很全面,翻译质量也还不错,本系列博文是对该书中并发章节的一个总结。

    用户2038589
  • 浅谈Android 的线程和线程池的使用

    从用途上分,线程分为主线程和子线程;主线程主要处理和界面相关的事情,子线程则往往用于耗时操作。

    砸漏
  • PHP pthread拓展使用和注意点

    Worker类的父类是Thread类,因此基本用法和Thread一样。而Worker类相对于Thread类来说,增加了线程复用的功能(以降低创建销毁线程所耗费的...

    砸漏
  • java Thread yield()方法的理解

    概念: 当调用Thread.yield()的时候,会给线程调度器一个当前线程愿意出让CPU的使用的暗示,但是线程调度器可能会忽略这个暗示。

    用户1251985
  • Python中threading模块

    源代码:Lib/threading.py 该模块在较低级别thread模块之上构建更高级别的线程接口。另请参见mutex和Queue模块。

    于小勇

扫码关注云+社区

领取腾讯云代金券