首页 > 编程语言 >Java-创建线程池的参数及工作原理

Java-创建线程池的参数及工作原理

时间:2023-12-15 12:44:18浏览次数:22  
标签:Java 队列 创建 corePoolSize 任务 线程 参数 执行

Java-创建线程池的参数及工作原理

常见的参数

  1. corePoolSize(核心线程数): 线程池中保持的最小线程数,即使它们是空闲的。
  2. maximumPoolSize(最大线程数): 线程池中允许的最大线程数。
  3. keepAliveTime(线程空闲时间): 当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新任务的最长时间。
  4. unit(空闲时间的时间单位): 用于指定 keepAliveTime 的时间单位。
  5. workQueue(工作队列): 用于保存等待执行的任务的队列。
  6. threadFactory(线程工厂): 用于创建新线程的工厂。
  7. handler(拒绝策略): 当工作队列和线程池都已满时,用于处理新任务的策略。

这些参数主要用于控制线程池的大小和行为。

工作原理

(1)提交任务后,若线程数小于corePoolSize, 就创建新线程来执行,否则,放入工作队列。

(2)若工作队列已满,且线程数小于maximumPoolSize,就创建新线程执行(任务完成后超时后自动终止),否则执行对应的拒绝策略(调用者执行、抛出异常、直接丢弃任务、丢弃最老任务或者自定义)。

  1. corePoolSize 和 maximumPoolSize:

    • 当提交一个新任务时,线程池会根据 corePoolSize 的设置创建线程来处理任务。
    • 如果当前线程数小于 corePoolSize,新任务将总是创建新线程来处理。
    • 当任务数超过 corePoolSize 时,线程池可以创建多达 maximumPoolSize 个线程来处理任务,这样可以应对任务的突然增加。
    • 超过 corePoolSize 的线程在任务完成后一定时间内(由 keepAliveTime 和 unit 决定)没有新任务可执行时,将被终止。
  2. workQueue:

    • 工作队列用于保存等待执行的任务。线程池会优先使用核心线程来处理任务,当核心线程数达到上限时,新任务将被放入工作队列。
    • 在工作队列中的任务会等待核心线程空闲时执行,或者在核心线程数已满的情况下创建新线程执行,直到线程数达到 maximumPoolSize。
    • 工作队列的选择对线程池的性能有影响,常见的工作队列包括有界队列(如 ArrayBlockingQueue​)和无界队列(如 LinkedBlockingQueue​)等。
  3. threadFactory:

    • 线程工厂用于创建新的线程。通过自定义线程工厂,可以指定新线程的一些属性,例如线程名、是否为守护线程等。
  4. handler(拒绝策略):

    • 当线程池和工作队列都满了,无法执行新任务时,拒绝策略会定义如何处理这种情况。常见的拒绝策略包括由调用者执行、抛出异常、直接丢弃任务、丢弃最老的任务等。

通过调整这些参数,可以根据应用程序的需求和特性来优化线程池的性能和行为。合理设置这些参数可以有效地控制线程池的大小、并发度和任务处理效率。

标签:Java,队列,创建,corePoolSize,任务,线程,参数,执行
From: https://www.cnblogs.com/anhaoyang/p/javaparameters-and-working-principles-of-creating-thre

相关文章

  • java: 通过URL读取hadoop HDFS
    packagetju;importorg.apache.hadoop.fs.FsUrlStreamHandlerFactory;importorg.apache.hadoop.io.IOUtils;importjava.io.InputStream;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLStreamHandlerFactory;publicclassReadF......
  • java: MappedByteBuffer的用法
    packagenio;importjava.io.RandomAccessFile;importjava.nio.MappedByteBuffer;importjava.nio.channels.FileChannel;publicclassMappedByteBufferTest{publicstaticvoidmain(String[]args)throwsException{RandomAccessFilerandomAccessF......
  • java之冒泡排序
    冒泡排序原理:从第一个数开始,和后面一个数比较大小,根据升序或者降序,看是否需要互换位置。每一轮会把1个数罗列到正确位置,经过数组长度-1轮比较,排序完成。比如:对数组{11,55,33,22,44}进行升序排列数组长度是5,需要经过5-1轮,每一轮需要比较5-当前轮次。publicc......
  • 【JAVA】Multiple markers at this line @Override的解决方法
    【未解决】我的是1.8,都显示的是1.8使用Eclipse进行项目开发,在实现类中的方法前面如果添加@Override就提示“Multiplemarkersatthisline”的错误,问题描述如下Multiplemarkersatthisline-ThemethodgetStudentByID(String)oftypeStudentBeanImplmustoverridea......
  • Java-Redis是如何保证高可用的?
    Java-Redis是如何保证高可用的?​​高性能基于内存的存储Redis是基于内存的存储系统,所有数据都保存在内存中,这使得Redis可以快速读取和写入数据。与传统的基于磁盘存储的系统相比,Redis的读写性能更高。单线程的设计是单线程的设计,所有的读写请求都由同一个线程处理,避免了多线......
  • JavaWeb - Day08 - MySQL - 多表查询、事务、索引 - Mybatis - 入门
    01.MySQL-多表查询-概述数据准备#建议:创建新的数据库createdatabasedb04;usedb04;--部门表createtabletb_dept(idintunsignedprimarykeyauto_incrementcomment'主键ID',namevarchar(10)notnulluniquecomment'部门名称',......
  • 两个线程共享一个套接字,其中一个线程使用sendmsg函数不断发送消息到该套接字,另一个线
    以下是使用C语言写的一段代码,实现两个线程共享一个套接字,其中一个线程使用sendmsg函数不断发送消息到该套接字,另一个线程使用recvmsg函数不断接收该套接字的消息,并打印出来的功能点击查看代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.......
  • Java-常见的排序算法有哪些
    Java-常见的排序算法有哪些比较排序算法:冒泡排序(BubbleSort):过程:从左到右依次比较相邻的元素,如果顺序不对就交换它们,一轮比较会将最大的元素冒泡到末尾。优势:简单易懂,对于小型数据集表现较好。劣势:时间复杂度为O(n^2),性能相对较差。插入排序(InsertionSort):过......
  • Java云架构、云服务、云运维的医院信息管理系统源码(云HIS)
    医院信息系统(HIS)经历了从手工到单机再到局域网的两个阶段,随着云计算、大数据新技术迅猛发展,基于云计算的医院信息系统将逐步取代传统局域网HIS,以适应人们对医疗卫生服务越来越高的要求。利用云计算、大数据等现代信息技术研发的医疗卫生信息平台(HIP)实现了医院信息化从局域网向互......
  • Mysql:非全局share的、connect独立分配的内存(及相关参数)说明
     join_buffer_size:sql语句中join连接时候,其中每个表分配的buffer大小。默认256k,最小128byte,最大4G(32位os)。它最大的问题是:立即分配,而不是按需分配! sort_buffer_size:sql语句中的orderby时候,为每个orderby分配的buffer大小。默认256K,最小32K,最大4G(32位os)......