线程池之newFixedThreadPool定长线程池的实例

 更新时间:2021年06月19日 09:00:56   作者:格子间里格子衫  
这篇文章主要介绍了线程池之newFixedThreadPool定长线程池的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

newFixedThreadPool定长线程池的实例

newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newFixedThreadPool固定线程池, 使用完毕必须手动关闭线程池, 否则会一直在内存中存在。

示例代码:

public class ThreadPoolFixed {
 public static void main(String[] args) {
  //设置线程池大小为3
  ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
  for (int i = 0; i < 10; i++) {
   final int index = i;
   fixedThreadPool.execute(new Runnable() {
 
    @Override
    public void run() {
     try {
      System.out.println(index+"当前线程"+Thread.currentThread().getName());
      Thread.sleep(2000);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   });
  }
  fixedThreadPool.shutdown();
 }
}

运行结果:

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。

corePoolSize:

线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。

这里需要注意的是:在刚刚创建ThreadPoolExecutor的时候,线程并不会立即启动,而是要等到有任务提交时才会启动,除非调用了prestartCoreThread/prestartAllCoreThreads事先启动核心线程。

再考虑到keepAliveTime和allowCoreThreadTimeOut超时参数的影响,所以没有任务需要执行的时候,线程池的大小不一定是corePoolSize。

maximumPoolSize:

线程池中允许的最大线程数,线程池中的当前线程数目不会超过该值。

如果队列中任务已满,并且当前线程个数小于maximumPoolSize,那么会创建新的线程来执行任务。

这里值得一提的是largestPoolSize,该变量记录了线程池在整个生命周期中曾经出现的最大线程个数。

为什么说是曾经呢?因为线程池创建之后,可以调用setMaximumPoolSize()改变运行的最大线程的数目。

poolSize:

线程池中当前线程的数量,当该值为0的时候,意味着没有任何线程,线程池会终止;同一时刻,poolSize不会超过maximumPoolSize。

定长线程池简易原理图及实现思路

队列中存放着实现了runnable接口的对象。每次有新任务的时候,就会往队列中push进一个对象。线程1-4需要定义为继承了Tread类的内部,在类中的run方法中,定一个while循环,不断的轮询送队列中取对象,执行对象中的run方法。

线程中需要存放着线程池的对象的指针,便于获取到线程池对象的队列。

当然,这个线程是是定长的。有些情况下,定长的数量不够,或者高峰期过后,长度需要降下来。这时候,就需要变长的线程池了。后续继续更新支持动态扩展的线程池的实现思路。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java集合WeakHashMap源码分析

    Java集合WeakHashMap源码分析

    这篇文章主要介绍了Java集合WeakHashMap源码分析,和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以是null,需要的朋友可以参考下
    2023-09-09
  • 一文详解Spring Boot可以同时处理多少请求

    一文详解Spring Boot可以同时处理多少请求

    SpringBoot是一个流行的Java开发框架,它被广泛用于构建Web应用程序,但是,开发人员通常会担心它的性能问题,特别是在高负载条件下,Spring Boot能够同时处理多少请求是一个重要的问题,在本文中,我们将讨论SpringBoot的请求处理能力,并介绍如何提高性能
    2023-10-10
  • Java布隆过滤器的应用实例

    Java布隆过滤器的应用实例

    这篇文章主要介绍了Java布隆过滤器的应用实例,在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题,如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题,需要的朋友可以参考下
    2023-11-11
  • 使用maven profile指定配置文件打包适用多环境的方法

    使用maven profile指定配置文件打包适用多环境的方法

    这篇文章主要介绍了使用maven profile指定配置文件打包适用多环境的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Jrebel License Server 激活 IDEA-Jrebel-在线-离线-均适用(推荐)

    Jrebel License Server 激活 IDEA-Jrebel-在线-

    这篇文章主要介绍了Jrebel License Server 激活 IDEA-Jrebel-在线-离线-均适用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java开发中可以防止界面假死的刷新代码

    Java开发中可以防止界面假死的刷新代码

    今天小编就为大家分享一篇关于Java开发中可以防止界面假死的刷新代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • java 中volatile和lock原理分析

    java 中volatile和lock原理分析

    这篇文章主要介绍了java 中volatile和lock原理分析的相关资料,需要的朋友可以参考下
    2017-03-03
  • Spring myBatis数据库连接异常问题及解决

    Spring myBatis数据库连接异常问题及解决

    这篇文章主要介绍了Spring myBatis数据库连接异常问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java中使用fileupload组件实现文件上传功能的实例代码

    Java中使用fileupload组件实现文件上传功能的实例代码

    这篇文章主要介绍了Java中使用fileupload组件实现文件上传功能的实例代码,需要的朋友可以参考下
    2017-05-05
  • java如何给指定类配置单独的日志文件输出

    java如何给指定类配置单独的日志文件输出

    这篇文章主要介绍了java如何给指定类配置单独的日志文件输出问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论