返回顶部
首页 > 资讯 > 精选 >如何理解Java常见知识点中的线程池
  • 148
分享到

如何理解Java常见知识点中的线程池

2023-06-05 03:06:19 148人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关如何理解Java常见知识点中的线程池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。线程池的基本思想是一种对象池,在程序启动时就开辟一块内存空间,里面存放了众多(未死亡)的

这期内容当中小编将会给大家带来有关如何理解Java常见知识点中的线程池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

线程池的基本思想是一种对象池,在程序启动时就开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

一. 使用线程池的好处

降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。;

提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行;

提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控

对线程进行一些简单的管理,比如:延时执行、定时循环执行的策略等,运用线程池都能进行很好的实现

一个线程池包括以下四个基本组成部分

  • 线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;

  • 工作线程(WorkThread):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

  • 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

  • 任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

二. ThreadPoolExecutor类

讲到线程池,要重点介绍java.uitl.concurrent.ThreadPoolExecutor类,ThreadPoolExecutor是线程池中最核心的一个类。

我们可以通过ThreadPoolExecutor来创建一个线程池

new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime, milliseconds,runnableTaskQueue, threadFactory,handler);
  • corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。

  • maximumPoolSize(线程池最大大小):线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是如果使用了无界的任务队列这个参数就没什么效果。

  • runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。

  • ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字,Debug和定位问题时非常又帮助。

  • RejectedExecutionHandler(拒绝策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。以下是jdk1.5提供的四种策略。n AbortPolicy:直接抛出异常。

  • keepAliveTime(线程活动保持时间):线程池的工作线程空闲后,保持存活的时间。所以如果任务很多,并且每个任务执行的时间比较短,可以调大这个时间,提高线程的利用率。

  • TimeUnit(线程活动保持时间的单位):可选的单位有天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

向线程池提交任务

我们可以通过execute()或submit()两个方法向线程池提交任务,不过它们有所不同

  • execute()方法没有返回值,所以无法判断任务知否被线程池执行成功

    threadsPool.execute(new Runnable() {  @Override  public void run() {  // TODO Auto-generated method stub }});
  • submit()方法返回一个future,那么我们可以通过这个future来判断任务是否执行成功,通过future的get方法来获取返回值

    try {   Object s = future.get(); } catch (InterruptedException e) { // 处理中断异常 } catch (ExecutionException e) { // 处理无法执行任务异常 } finally { // 关闭线程池 executor.shutdown();}

    线程池的关闭

我们可以通过shutdown()或shutdownNow()方法来关闭线程池,不过它们也有所不同

  • shutdown的原理是只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

  • shutdownNow的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务可能永远无法终止。shutdownNow会首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表。

ThreadPoolExecutor执行的策略

线程数量未达到corePoolSize,则新建一个线程(核心线程)执行任务

线程数量达到了corePools,则将任务移入队列等待

队列已满,新建线程(非核心线程)执行任务

队列已满,总线程数又达到了maximumPoolSize,就会由(RejectedExecutionHandler)抛出异常

四种拒绝策略

  • ThreadPoolExecutor.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常

  • ThreadPoolExecutor.DiscardPolicy() 抛弃当前的任务

  • ThreadPoolExecutor.DiscardOldestPolicy() 抛弃旧的任务 (队列中的第一个任务替换为当前新进来的任务执行)

  • ThreadPoolExecutor.CallerRunsPolicy() 重试添加当前的任务,他会自动重复调用execute()方法

三. Java通过Executors提供四种线程池

1. CachedThreadPool():可缓存线程池

  • 线程数无限制

  • 有空闲线程则复用空闲线程,若无空闲线程则新建线程 一定程序减少频繁创建/销毁线程,减少系统开销

CachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程

2. FixedThreadPool():定长线程池

  • 可控制线程最大并发数(同时执行的线程数)

  • 超出的线程会在队列中等待

  • 如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3. ScheduledThreadPool()

  • 定时线程池。

  • 支持定时及周期性任务执行。

newscheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下.表示延迟1秒后每3秒执行一次

public class ThreadPoolExecutorTest3 {    public static void main(String[] args) {        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {            public void run() {                System.out.println(Thread.currentThread().getName() + ": delay 1 seconds, and excute every 3 seconds");            }        }, 1, 3, TimeUnit.SECONDS);// 表示延迟1秒后每3秒执行一次    }}

4. SingleThreadExecutor():单线程化的线程池

  • 有且仅有一个工作线程执行任务

  • 所有任务按照指定顺序执行,即遵循队列的入队出队规则

newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行,如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行

四. 线程池的监控

通过继承线程池并重写线程池的beforeExecute,afterExecute和terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等。这几个方法在线程池里是空方法。

上述就是小编为大家分享的如何理解Java常见知识点中的线程池了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何理解Java常见知识点中的线程池

本文链接: https://lsjlt.com/news/241108.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解Java常见知识点中的线程池
    这期内容当中小编将会给大家带来有关如何理解Java常见知识点中的线程池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。线程池的基本思想是一种对象池,在程序启动时就开辟一块内存空间,里面存放了众多(未死亡)的...
    99+
    2023-06-05
  • 如何理解Java常见知识点中的class loader
    本篇文章给大家分享的是有关如何理解Java常见知识点中的class loader,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一. 什么是classLoader当我们写好一个J...
    99+
    2023-06-05
  • 如何理解Java常见知识点中的Jvm架构
    如何理解Java常见知识点中的Jvm架构,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种...
    99+
    2023-06-05
  • 如何理解Java知识点中的常见设计模式
    这期内容当中小编将会给大家带来有关如何理解Java知识点中的常见设计模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一. 观察者模式观察者模式用一句话描述就是当一个类的对象(被观察者)的状态发生改变时同...
    99+
    2023-06-05
  • 如何理解Java常见知识点中的分派机制
    如何理解Java常见知识点中的分派机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java中,符合“编译时可知,运行时不可变”这个要求的方法主要是静态方法和私有方法。这...
    99+
    2023-06-05
  • Java线程池知识点有哪些
    这篇文章将为大家详细讲解有关Java线程池知识点有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、线程数使用开发规约阿里巴巴开发手册中关于线程和线程池的使用有如下三条强制规约【强制】创建线程或线程池...
    99+
    2023-06-29
  • Java线程池全面知识点总结
    本篇内容介绍了“Java线程池全面知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!原理线程池的原理非常简单,这里用处理流程来概括:线...
    99+
    2023-06-25
  • Java线程池必知必会知识点总结
    目录1、线程数使用开发规约2、 ThreadPoolExecutor源码1. 构造函数2.核心参数3.execute()方法3、线程池的工作流程4、Executors创建返回Thre...
    99+
    2024-04-02
  • Java 线程池常见问题详解
    线程池是一个预定义线程集合,可按需提供给应用程序使用。它通过管理线程的创建和销毁,简化了线程处理,提高了应用程序的性能和可伸缩性。 为什么使用线程池? 使用线程池有以下好处: 减少线程创建和销毁的开销,提高性能。 限制并发线程数,防止系...
    99+
    2024-03-13
    线程池
  • Java中锁的常见知识点有哪些
    本篇文章给大家分享的是有关Java中锁的常见知识点有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。锁的概念可重入锁如果锁具备可重入性,则称作为可重入锁。像synchroni...
    99+
    2023-06-05
  • 怎么理解Java常见知识点中的垃圾回收机制
    这篇文章将为大家详细讲解有关怎么理解Java常见知识点中的垃圾回收机制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java堆中存放着大量的Java对象实例,在垃圾收集器回收内存前,第一件事...
    99+
    2023-06-05
  • Java中线程的知识点有哪些
    本篇内容介绍了“Java中线程的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1  .资源冲突,如果两个线程确实是在修...
    99+
    2023-06-17
  • Java常见知识点中的泛型指的是什么
    本篇文章为大家展示了Java常见知识点中的泛型指的是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List作为形式...
    99+
    2023-06-05
  • Java常见知识点中==和equals的区别是什么
    这篇文章将为大家详细讲解有关Java常见知识点中==和equals的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。== 是一个运算符。 equals则是string对象的方法。ja...
    99+
    2023-06-05
  • MySQL必备的常见知识点汇总整理
    本文实例总结了MySQL必备的常见知识点。分享给大家供大家参考,具体如下: 最近在整理 sql 的时候发现一份优秀的笔记,是原作者学习 sql 所做的笔记,分享这份总结给大家,对大家对 sql 的可以来一次全方位的...
    99+
    2022-05-28
    MySQL 知识点
  • Java中的异常和处理知识点总结
    这篇文章主要介绍“Java中的异常和处理知识点总结”,在日常操作中,相信很多人在Java中的异常和处理知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的异常和处理知识点总结”的疑惑有所帮助!...
    99+
    2023-06-17
  • 如何理解java 知识点的集合分析
    今天就跟大家聊聊有关如何理解java 知识点的集合分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 、对象的初始化  (1 )非静态对象的初始化  在创建对象时,对象所在类的所有...
    99+
    2023-06-02
  • Java多线程的其他知识_动力节点Java学院整理
    一、线程组 ...
    99+
    2023-05-31
    java 多线程 知识
  • java多线程的核心知识点是什么
    这篇文章主要介绍“java多线程的核心知识点是什么”,在日常操作中,相信很多人在java多线程的核心知识点是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java多线程的核心知识点是什么”的疑惑有所帮助!...
    99+
    2023-06-20
  • Java线程面试题的知识点有哪些
    本篇内容主要讲解“Java线程面试题的知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程面试题的知识点有哪些”吧!一、sychronied 修饰普通方法和静态方法的区别?什么...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作