当前位置: 首页 > 网络应用技术

JUC并发编程 - 线程池简介和基础实施

时间:2023-03-06 15:35:51 网络应用技术

  合并技术

  体积化技术是一种非常常见的编程技术,当请求较大并减少系统的频繁资源开销时,显然可以优化应用程序性能。常见的数据库连接池,线程池,对象池等。在我们的日常工作中,它们是以维护特定“池”中的“昂贵”和“时间耗尽资源”的特征,该资源规定其最小连接数量。对于统一的管理和重用,最大的连接,阻塞队列等是方便的。通常,还附有一些支持功能,例如勘探机制,强迫恢复和监测。

  线程池

  在实际生产环境中,可能需要许多线程来支持整个应用程序。当线程数量很大时,它将耗尽CPU资源。如果线程不受控制和管理,则会影响程序的性能。

  线程费用主要包括:创建和启动线程;螺纹破坏开销;线程调度开销;线程数量限制CPU处理器。

  线程池是有效使用线程的常见方法。

  可以在线程池中创建一定数量的工作线程。客户端代码直接将任务作为对象提交到线程池。线程池在工作队列中放慢这些任务。

  线程池的好处:

  JDK提供了一组执行器工具,可以帮助开发人员有效使用线程池。

  创建并使用线程池

  在执行器工具类中查看newcachedthreadpool(),newsinglethreadexcecutor(),newfixedthreadpool()源代码:源代码:源代码:源代码:

  newcachedthreadpool():创建一个带有缩放和收缩的线程池

  newsinglethreadexcecutor():创建一个线程 - 大小线程池

  newFixedThreadPool():创建一个固定的 - 大小线程池

  祖先工具类中线程池的底层使用底层的ThreadPoolExecutor线程池。这些方法由ThreadPoolExecutor线程池封装:

  每个参数的含义:

  CorePoolSize,指定线程池中的核心线程数。

  maxinumpoolsize,线程池中最大的线程数。

  当keepalivetime时,当线程池螺纹的数量超过corepoolsize时,多余的自由线的生存时间,即,长时间内的空螺纹被销毁了多长时间。

  单位是keepalivetime持续时间。

  WorkQueue,任务队列,将任务提交到任务队列并等待执行。

  线程捕获,用于创建线程的线程工厂。

  处理程序拒绝该策略,如何在任务为时已晚时拒绝。

  ThreadPoolExecutor构造函数的最后一个参数指定拒绝策略。当提交到线程池的任务超过实际承载能力时,如何处理?也就是说,线程池中的线程已被用尽。任务服务可以通过拒绝策略来解决此问题。JDK提供了四种类型的拒绝策略:

  ●流产策略会抛出异常(默认)。

  ●Callerrunspolicy策略,只要线程池未关闭,它将在呼叫者线程中运行当前丢弃的任务。

  ●丢弃任务队列中最古老的任务,然后尝试再次提交新任务。

  ●丢弃的人直接丢弃这项未准备好任务。

  参考文章:http://ww.bjpowernode.com/javathread/1233.html

  在阿里巴巴Java开发手册中解释了最好使用ThreadPoolExecutor创建线程池以避免OOM(内存溢出):

  创建线程池代码描述:

  补充:如何设置线程池中的最大线程数

  1. CPU致密类型:最大线程数应等于CPU核数 + 1

  CPU使用率很高(即某些复杂的操作,逻辑处理)

  2. i/o - 致密类型:最大线的参考值应等于CPU核编号x 2

  CPU消耗非常小,大多数任务都在等待IO操作(因为IO的速度远低于CPU和内存的速度)

猜你喜欢