java 线程池的理解与运用,实例支撑

这篇具有很好参考价值的文章主要介绍了java 线程池的理解与运用,实例支撑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线程池的概念和作用

线程池的定义和特点

线程池是一种多线程处理形式,它可以在程序启动时创建一定数量的线程,并将它们保存在一个线程池中,然后在需要执行任务时,从线程池中取出一个线程来执行任务,任务执行完毕后,线程并不会销毁,而是放回线程池中等待下一次任务的执行。
线程池的特点包括:

  • 能够复用线程,避免线程的频繁创建和销毁,提高系统的性能和效率;
  • 能够控制线程的数量,避免线程数量过多导致系统负载过高;
  • 能够统一管理线程,避免线程的无限制创建和销毁导致系统资源的浪费。

线程池的作用和优势

线程池的作用包括:

  • 提高系统的响应速度和吞吐量;
  • 优化系统的资源利用率;
  • 提高代码的可维护性和可扩展性。
    线程池的优势包括:
  • 可以避免线程的频繁创建和销毁,提高系统的性能和效率;
  • 可以控制线程的数量,避免线程数量过多导致系统负载过高;
  • 可以统一管理线程,避免线程的无限制创建和销毁导致系统资源的浪费。

Java中的线程池

Java中线程池的实现方式

Java中线程池的实现方式主要包括以下两种:

  • ThreadPoolExecutor:是Java中线程池的基础实现类,它可以根据需求自定义线程池的各种参数,如核心线程数、最大线程数、任务队列、线程工厂、拒绝策略等;
  • Executors:是Java中线程池的工厂类,它提供了一系列静态方法来创建不同类型的线程池,如newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor等。

Java中线程池的分类

Java中线程池的分类主要包括以下几种:

  • FixedThreadPool:固定大小的线程池,核心线程数和最大线程数相等,任务队列为无界队列;
  • CachedThreadPool:缓存大小的线程池,核心线程数为0,最大线程数为Integer.MAX_VALUE,任务队列为SynchronousQueue;
  • SingleThreadExecutor:单线程的线程池,只有一个核心线程,任务队列为无界队列;
  • ScheduledThreadPool:定时任务的线程池,可以执行定时任务和周期性任务;
  • WorkStealingPool:工作窃取线程池,在任务执行完毕后,线程可以从其他线程的任务队列中窃取任务执行。

Java线程池的使用

如何创建线程池

使用Java中的Executors工厂类可以创建不同类型的线程池,例如:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

// 创建缓存大小的线程池

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

// 创建单线程的线程池

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

// 创建定时任务的线程池

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);

使用ThreadPoolExecutor类可以自定义线程池的各种参数,例如:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
    5, // 核心线程数
    10, // 最大线程数
    60, // 线程空闲时间
    TimeUnit.SECONDS, // 时间单位
    new LinkedBlockingQueue<Runnable>(), // 任务队列
    new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build(), // 线程工厂
    new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);

如何向线程池提交任务

向线程池提交任务可以使用submit或execute方法,例如:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
 // 提交任务
fixedThreadPool.submit(new Runnable() {
    @Override
    public void run() {
        // 任务执行内容
    }
});


 // 执行任务
fixedThreadPool.execute(new Runnable() {
    @Override
    public void run() {
        // 任务执行内容
    }
});

如何关闭线程池

关闭线程池可以使用shutdown或shutdownNow方法,例如:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
 // 关闭线程池
fixedThreadPool.shutdown();

Java线程池的原理

线程池的工作原理

线程池的工作原理如下:

  • 当有任务需要执行时,线程池会先检查核心线程数是否已满,如果未满,则创建新的核心线程来执行任务;
  • 如果核心线程数已满,线程池会将任务加入到任务队列中等待执行;
  • 如果任务队列已满,线程池会检查最大线程数是否已满,如果未满,则创建新的非核心线程来执行任务;
  • 如果最大线程数已满,线程池会根据拒绝策略来处理任务。

线程池的核心参数

线程池的核心参数包括:

  • 核心线程数:线程池中的核心线程数,即线程池中始终保持的线程数。
  • 最大线程数:线程池中允许的最大线程数,包括核心线程数和非核心线程数。
  • 任务队列:用于存放等待执行的任务的队列。
  • 拒绝策略:当任务队列已满且最大线程数已满时,线程池会根据拒绝策略来处理新的任务。
    线程池的核心参数的设置需要根据具体的业务场景和硬件资源来进行调整。如果线程池的核心线程数设置过小,可能会导致任务无法及时执行;如果设置过大,则可能会浪费过多的资源。最大线程数的设置也需要根据硬件资源来进行调整,避免过度占用系统资源。任务队列的大小也需要根据具体的业务场景来进行设置,以充分利用系统资源,并避免任务队列溢出。拒绝策略的设置也需要根据具体的业务场景来进行调整,以保证任务的及时处理。

Java线程池的拒绝策略

Java线程池中提供了4种拒绝策略,分别是:

  1. AbortPolicy:默认策略,当任务队列满且达到最大线程数时,直接抛出RejectedExecutionException异常,阻止任务提交。
  2. CallerRunsPolicy:当任务队列满且达到最大线程数时,将任务交给提交任务的线程执行,这样可以降低任务提交速度,从而提供系统的稳定性。
  3. DiscardOldestPolicy:当任务队列满且达到最大线程数时,移除任务队列中的头部任务,然后尝试重新提交新任务。
  4. DiscardPolicy:当任务队列满且达到最大线程数时,直接丢弃新提交的任务,不进行任何处理。

在创建线程池时,可以通过设置ThreadPoolExecutor的拒绝策略参数来选择合适的拒绝策略,例如:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
    5, // 核心线程数
    10, // 最大线程数
    60, // 线程空闲时间
    TimeUnit.SECONDS, // 时间单位
    new LinkedBlockingQueue<Runnable>(), // 任务队列
    new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build(), // 线程工厂
    new ThreadPoolExecutor.CallerRunsPolicy() // 使用CallerRunsPolicy拒绝策略
);

选择合适的拒绝策略需要根据具体的业务场景和需求来进行判断。例如,如果希望能够在任务提交过快时降低任务提交速度,可以选择使用CallerRunsPolicy策略;如果希望在任务队列满时优先执行新提交的任务,可以选择使用DiscardOldestPolicy策略。

总之,线程池是一种重要的多线程编程技术,它可以有效地管理线程的创建和销毁,提高系统的并发能力和响应速度。在使用线程池时,需要注意线程池的核心参数的设置,以充分利用系统资源,并保证任务的及时处理。文章来源地址https://www.toymoban.com/news/detail-471091.html

到了这里,关于java 线程池的理解与运用,实例支撑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot线程池和Java线程池的实现原理

    @ 目录 使用默认的线程池 方式一:通过 @Async 注解调用 方式二:直接注入 ThreadPoolTaskExecutor 线程池默认配置信息 SpringBoot 线程池的实现原理 覆盖默认的线程池 管理多个线程池 JAVA常用的四种线程池 newCachedThreadPool newFixedThreadPool newScheduledThreadPool newSingleThreadExecutor Java 线程池中

    2023年04月11日
    浏览(30)
  • Java线程池的类型和使用

    在并发编程中,线程池是一种非常重要的工具,它可以实现线程的复用,避免频繁地创建新线程,从而提高程序的性能和效率。Java的并发库提供了丰富的线程池功能,本文将介绍Java线程池的类型和使用。 线程池是一种执行多个任务的并发模型。它由一个线程队列和一组可重

    2024年02月13日
    浏览(33)
  • Java 线程池的原理与实现

    最近在学习线程池、内存控制等关于提高程序运行性能方面的编程技术,线程池就是其中之一,一提到线程,我们会想到以前《操作系统》的生产者与消费者,信号量,同步控制等等。 一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议 :在阅读本文前,先理

    2024年02月13日
    浏览(24)
  • Java 线程池的基本操作

    2024年02月20日
    浏览(24)
  • 你知道 Java 线程池的原理吗?

    Java线程池是用于管理和复用线程的机制,它可以帮助开发者有效地管理线程的生命周期和资源,并提高应用程序的性能和稳定性。 1. 线程池概述 在计算机科学中,线程池是一种可用来执行异步任务的线程队列。它主要包含以下几个组成部分: 工作队列(BlockingQueue) :用于

    2024年04月12日
    浏览(30)
  • SpringBoot线程池和Java线程池的用法和实现原理

    @ 目录 使用默认的线程池 方式一:通过 @Async 注解调用 方式二:直接注入 ThreadPoolTaskExecutor 线程池默认配置信息 SpringBoot 线程池的实现原理 覆盖默认的线程池 管理多个线程池 JAVA常用的四种线程池 newCachedThreadPool newFixedThreadPool newScheduledThreadPool newSingleThreadExecutor Java 线程池中

    2023年04月11日
    浏览(29)
  • Java多线程 - 创建线程池的方法 - ThreadPoolExecutor和Executors

    线程池介绍 什么是线程池 ? 线程池就是一个可以复用线程的技术。 不使用线程池的问题 : 如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。 线程池工作原理 : 例如线程池

    2023年04月16日
    浏览(32)
  • Java中线程池的使用及原理(附带线程池拒绝策略介绍)

    目录 1.使用线程池的目的 2.线程池的使用及原理 3.生动讲解拒绝策略: 4.自己实现一个简单的线程池 5.线程数的决定方法 6.总结 希望各位大佬能多多点赞关注收藏,有了你们的支持,我也能更有动力的向你们学习不是(手动狗头)!!! 在知道线程池之前,每当我们需要一

    2024年04月17日
    浏览(26)
  • Java并发编程学习16-线程池的使用(中)

    上篇分析了在使用任务执行框架时需要注意的各种情况,并简单介绍了如何正确调整线程池大小。 本篇将继续介绍对线程池进行配置与调优的一些方法,详细如下: ThreadPoolExecutor 为 Executors 中的 newCachedThreadPool 、 newFixedThreadPool 和 newScheduledThreadExecutor 等工厂方法返回的 Exe

    2024年02月10日
    浏览(28)
  • Java并发编程学习18-线程池的使用(下)

    上篇介绍了 ThreadPoolExecutor 配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。 还记得我们在《Java并发编程学习11-任务执行演示》中,对页面绘制程序进行一系列改进,这些改进大大地提供了页面绘制的并行性。 我们简单回顾下相关的改进过程: 第一次新增时,页

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包