• 线程三连鞭之“线程池”


    线程池🎇

    一:为什么要使用线程池?

    在实际使用中,创建和销毁线程花费的时间和消耗的系统资源相当大,甚至可能要比处理实际的用户请求的时间和资源开销大。
    如果在一个JVM里面创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统的资源不足(OOM)需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费大的线程的创建和销毁,尽量利用已有的对象来进行服务。
    因此,引出了线程池。预先创建一组线程,放入池中中,用的时候取出,用完再放回。
    在这里插入图片描述

    Executors 类:提供工厂方法用来创建不同类型的线程池。比如: 1.newSingleThreadExecutor()
    创建一个只有一个线程的线程池, 一个任务一个任务执行,一池一线程(例如窗口只能服务一个人,后面来的只能等待)
    2.newFixedThreadPool(int N)
    创建固定线程数的线程池,
    3.newCachedThreadPool()
    线程池根据需求创建线程,可扩容,遇强则强(银行一共7个窗口,只开放了3个窗口,其他4个窗口没有开放,如果人很多就要开放其余的窗口,高峰结束再恢复到3个窗口状态)
    4.newScheduledThreadPool (了解)
    创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求。
    场景: 适用于需要多个后台线程执行周期任务的场景

    在这里插入图片描述
    Java里面线程池的顶级接口是 Executor,不过真正的线程池接口是 ExecutorService, ExecutorService 的默认实现是 ThreadPoolExecutor;

    二:线程池相关的参数(7个):

    • corePoolSize (线程池的核心线程数量也叫常驻线程),一般情况下不管有没有任务都会一直在线程池中存活。
    • maximumPoolSize (线程池所能容纳的最大线程数),当活动的线程数达到这个值后,后续的新任务会被阻塞
    • keepAliveTime (线程的闲置超时时长)
    • unit (时间单位(second等))
    • workQueue (任务队列也叫阻塞队列),当核心线程达到最大数量时,并不是直接开启新线程,而是进入阻塞队列中排队等待,如果阻塞队列满,才开启新的线程。
    • threadFactory (线程工厂),一个接口,用来为线程池创建新线程。
    • RejectedExecutionHandler (拒绝策略)
      在这里插入图片描述

    在这里插入图片描述
    线程池的关闭
    ThreadPoolExecutor 提供了两个方法,用于线程池的关闭,分别是
    shutdown() 和 shutdownNow()。
    shutdown():不会立即的终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务。
    shutdownNow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务。

    面试题:

    1)什么是 Executor 框架?
    Executor框架在Java 5中被引入,Executor 框架是一个根据一组执行策略调用、调度、执行和控制的异步任务的框架。
    无限制的创建线程会引起应用程序内存溢出,所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用 Executor 框架可以非常方便的创建一个线程池。
    2)Executors 类是什么?
    Executors为Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类提供了一些工具方法。Executors 可以用于方便的创建线程池。

  • 相关阅读:
    C++(一)
    python小游戏编程arcade----坦克动画图片合成
    java抽象类(强制子类重写全部)
    Trino 387 Docker 部署配置数据源后不显示对应数据Catalog
    【 OpenGauss源码学习 —— 列存储(update_pages_and_tuples_pgclass)】
    Python中不同进制间的转换
    PPT/PS——设置图片的背景为透明色的方法
    qt槽函数的四种写法
    【华为机试真题 JAVA】服务器广播-200
    微服务之 consul
  • 原文地址:https://blog.csdn.net/kallenAB/article/details/126165809