创建线程池有哪几种方式

article/2025/9/14 17:09:28

通常开发者都是利用Executors提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的

Executors目前提供了5种不同的线程池创建配置:

1、newCachedThreadPool(),它是用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置时间超过60秒,则被终止并移除缓存;长时间闲置时,这种线程池,不会消耗什么资源。其内部使用SynchronousQueue作为工作队列。

2、newFixedThreadPool(int nThreads),重用指定数目(nThreads)的线程,其背后使用的是无界的工作队列,任何时候最多有nThreads个工作线程是活动的。这意味着,如果任务数量超过了活动线程数目,将在工作队列中等待空闲线程出现;如果工作线程退出,将会有新的工作线程被创建,以补足指定数目nThreads。

3、newSingleThreadExecutor(),它的特点在于工作线程数目限制为1,操作一个无界的工作队列,所以它保证了所有的任务都是被顺序执行,最多会有一个任务处于活动状态,并且不予许使用者改动线程池实例,因此可以避免改变线程数目。

4、newSingleThreadScheduledExecutor()和newScheduledThreadPool(int corePoolSize),创建的是个ScheduledExecutorService,可以进行定时或周期性的工作调度,区别在于单一工作线程还是多个工作线程。

5、newWorkStealingPool(int parallelism),这是一个经常被人忽略的线程池,Java 8 才加入这个创建方法,其内部会构建ForkJoinPool,利用Work-Stealing算法,并行地处理任务,不保证处理顺序。

Executor框架的基本组成

各个类型的设计目的

1、Executor是一个基础的接口,其初衷是将任务提交和任务执行细节解耦,这一点可以天汇其定义的唯一方法。

  void execute(Runnable command);

2、ExecutorService则更加完善,不仅提供service管理,比如shutdown等方法,也提供了更加全面的提交任务机制,如返回Future而不是 void 的 submit 方法

  <T> Future<T> submit(Callable<T> task);

注意,这个例子输入的可是Callable,它解决了Runnable无法返回结果的困扰。

3、Java标准类库提供了几种基础实现,比如 ThreadPoolExecutor、ScheduledThreadPoolExecutor、ForkJoinPool。这些线程池设的设计特点在于其高度的可调节性和灵活性,以尽量满足复杂多变的实际应用场景,我会进一步分析其构建部分的源码,剖析这种灵活性的源头。

4、Executors则从简化使用的角度,为我们提供了各种方便的静态工长方法。

阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险

下面从源码角度,分析线程池的设计与实现,将主要围绕最基础的ThreadPoolExecutor源码。ScheduledThreadPoolExecutor是ThreadPoolExecutor的扩展,主要是增加了调度逻辑。而ForkJoinPool则是为了ForkJoinTask定制的线程池,与通常意义的线程池有所不同。

在现实应用中,理解应用于线程池的交互和线程池内部的工作过程,可以参考下图。

 

 简单理解一下:

1、工作队列负责存储用户提交的各个任务,这个工作队列,可以是容量为0的 SynchronousQueue(使用newCachedThreadPool),也可以是像固定大小线程池(newFixedThreadPool)那样使用LinkedBlockingQueue。

  private final BlockingQueue<Runnable> workQueue;

2、内部的“线程池”,这是指保持工作线程的集合,线程池需要在运行过程中管理线程创建、销毁。例如,对于带缓存的线程池,当任务压力较大时,线程池会创建新的工作线程;当业务压力退去,线程池会闲置一段时间(默认60秒)后结束线程。

  private final HashSet<Worker> workers = new HashSet<Worker>();

  线程池的工作线程被抽象为静态内部类Worker,基于AQS实现

3、ThreadFactory提供上面所需要的创建线程逻辑。

4、如果任务提交时被拒绝,比如线程池已处于SHUTDOWN状态,需要为其提供处理逻辑,Java 标准库提供了类似 ThreadPoolExecutor.AbortPolicy 等默认实现,也可以按照实际需要自定义。

从上面的分析,就可以看出线程池的几个基本组成部分,一起都体现在线程池的构造函数中,从字面我们就可以猜测到其用意:

1、corePoolSize, 稍微的核心线程数,可以大致理解为长期驻留的线程数目(除非设置了allowCoreThreadTimeOut)。对于不同的线程池,这个值可能会有很大区别,比如newFixedThreadPool 会将其设置为 nThreads ,而对于newCachedThreadPool则设为0。

2、maximumPoolSize,顾名思义,就是线程不够时能够创建的最大线程数。同样进行对比,对于newFixedThreadPool,当然就是nThreads,以为其要求是固定大小,而newCachedThreadPool则是Integer.VALUE。

3、keepAliveTime和TimeUnit,这两个参数指定了额外的线程能够闲置多久,显然有些线程池不需要它。

4、workQueue,工作队列,必须是BlockingQueue。

通过配置不同的参数,我们就可以创建出行为大相径庭的线程池,这就是线程池高度灵活性的基础。

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), handler);
}

http://chatgpt.dhexx.cn/article/uqmUfRtc.shtml

相关文章

Java常见的5种线程池

在开发过程中我们常常需要使用到多线程来提高我们代码处理某些任务的效率&#xff0c;最基本的两种创建多线程的方式分别是继承Thread类和实现Runnable接口。但是创建线程和销毁线程的系统开销比较大&#xff0c;而且过多的线程会占用过多的内存等资源。在《阿里巴巴Java开发手…

4种常用线程池介绍

一. 线程池简介 1. 线程池的概念&#xff1a; 线程池就是首先创建一些线程&#xff0c;它们的集合称为线程池。使用线程池可以很好地提高性能&#xff0c;线程池在系统启动时即创建大量空闲的线程&#xff0c;程序将一个任务传给线程池&#xff0c;线程池就会启动一条线程来执…

面试突击:线程池有几种创建方式?推荐使用哪种?

在 Java 语言中&#xff0c;并发编程都是通过创建线程池来实现的&#xff0c;而线程池的创建方式也有很多种&#xff0c;每种线程池的创建方式都对应了不同的使用场景&#xff0c;总体来说线程池的创建可以分为以下两类&#xff1a; 通过 ThreadPoolExecutor 手动创建线程池。…

线程池的分类(5种)

Java面试高频提问点 问题一&#xff1a;线程池的创建方式 文章目录 Java面试高频提问点前言一、线程池的分类1.newCachedThreadPool2.newFixedThreadPool3.newSingleThreadExecutor4.newScheduleThreadPool5.newSingleThreadScheduledExecutor 总结 前言 近期因为上海疫情原因…

docker搭建pxc

1、设置阿里云加速器 先搭建一个加速器为后面下载镜像做准备 2、下载pxc镜像 docker pull percona/percona-xtradb-cluster:5.7.21 #下载镜像 docker tag percona/percona-xtradb-cluster:5.7.21 pxc #改镜像名 docker rmi percona/percona…

mysql bootstrap pxc_MYSQL PXC

下载ssl101的安装包上传服务器对应安装目录/usr/local 目录。 [rootlocalhost ~]# yum -y install openssl openssl-devel perl-Time-HiRes perl-DBD-MySQL.x86_64 perl-IO-Socket-SSL.noarch [rootpxc2 ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm warning: libev-4.15…

mysql pxc集群介绍_PXC集群的概述及搭建

PXC集群的概述及搭建 PXC集群的简介 Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法。PXC集群以节点组成(推荐至少3节点&#xff0c;便于故障恢复&#xff0c;后面会讨论两节点的情况)&#xff0c;每个节点都是基于常规的 MySQL/Percona Server&…

pxc 数据库

一 首先 拉取pxc镜像 docker pull percona/percona-xtradb-cluster 重命名pxc名字 docker tag percona/percona-xtradb-cluster pxc 删除之前的 docker rmi percona/percona-xtradb-cluster 二 创建内部网络 docker network create --subnet172.18.0.0/24 net1 查看net1网…

MySQL_PXC集群_综合应用

MySQL_PXC集群_综合应用 简述部署PXC集群和主从区别综合应用部署PXC集群部署主从复制集群MasterSlave 部署MyCat节点一节点二 部署HAProxy 简述 Percona XtraDB Cluster&#xff08;简称PXC&#xff09;是针对MySQL用户的高可用性和扩展性解决方案&#xff0c;基于Percona Ser…

mysql pxc 使用_PXC使用介绍

用户发起Commit&#xff0c;在收到Ok之前 集群每次发起一个动作&#xff0c;都会有一个唯一的编号 PXC独有的Global Trx Id 动作发起者: commit_cb其它节点多了一个动作&#xff1a; apply_cb 上面的这些动作&#xff0c;是通过那个端号交互的&#xff1f;4567 4568端口 IST 只…

docker搭建pxc集群

因为公司需要搭建mysql集群&#xff0c;本来使用原生的mysql镜像搭建了一个简单的主从集群&#xff0c;后来发现使用pxc集群更加方便快捷&#xff0c;而且数据同步性能更强&#xff0c;所以尝试搭建一个pxc集群。 1.pxc介绍 Percona XtraDB Cluster&#xff08;PXC集群&#…

mysql gtid 还是pxc_PXC中的GTIDs

基本环境&#xff1a;PXC 5.7.19 RowGtid&#xff0c;3节点 一、Galera GTID vs MySQL GTID 1.1、Galera GTID vs MySQL GTID Both kinds of GTIDs are using the same format: . For Galera, is generated when the cluster is bootstrapped. This is shared by all nodes. Fo…

mysql pxc搭建_MySQL(PXC)集群搭建

前言 我这里使用三台CentOS Linux release 7.8.2003的虚拟机来作演示 [rootn1 ~]# cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core) 安装前准备 请确保服务器没有安装MySQL&#xff0c;如果已经安装了请先卸载(后面会起冲突) 删除 MariaDB 这里我的服务器版本为…

docker pxc mysql_docker安装pxc集群的详细教程

前言 现在mysql自建集群方案有多种&#xff0c;keepalived、MHA、PXC、MYSQL主备等&#xff0c;但是目前根据自身情况和条件&#xff0c;选择使用pxc的放来进行搭建&#xff0c;最大的好处就是&#xff0c;多主多备&#xff0c;即主从一体&#xff0c;没有同步延时问题&#xf…

mysql pxc gcache_MySQL高可用之PXC

PXC简介 PXC(Percona XtraDB Cluster)是一个开源的MySQL高可用解决方案。他将Percona Server和XtraBackup与Galera库集成&#xff0c;以实现同步多主复制。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster&#xff0c;目前PXC架构在生产线上用的更…

PXC集群

1.pxc集群 1.1 软件介绍 • Percona XtraDB Cluster(简称PXC) - 是基于Galera的mysql高可用集群解决方案 - Galera Cluster是Codership公司开发的一套免费开源的高可用方案 - PXC集群主要由两部分组成:Percona Server with XtraDB和Write Set Replication patches(同步,多主复制…

mysql bootstrap pxc_Mysql高可用之PXC

一。PXC简介 Percona XtraDB Cluster简称PXC。是一套开源mysql高可用解决方案(XtraDb是mysql被oracle收购之前 开源一个分支 其他分支还有mariadb)&#xff0c;Percona Xtradb Cluster的实现是在原mysql代码上通过Galera包将不同的mysql实例(新名称 Percona Server)连接起来&am…

mysql pxc 安装_MYSQL PXC 集群安装

名词介绍&#xff1a; WS&#xff1a;write set写数据集 IST: Incremental State Transfer增量同步 SST&#xff1a;State Snapshot Transfer全量同步 1.准备环境 1.1 centos 7系统,三台主机 IP分别为&#xff1a;192.168.80.163&#xff1b;192.168.80.167&#xff1b;192.168…

kubernetes mysql pxc_PXC快速入门

C C语言开发 PXC快速入门 1.快速入门 实验环境&#xff1a; Node Host IPNode1 pxc1 192.168.70.61 Node2 pxc2 192.168.70.62 Node3 pxc3 192.168.70.63 1.1 安装Percona-XtraDb-Cluster yum源&#xff1a; [percona] namepercona_repo baseurl https://mirrors.tuna.tsinghu…

mysql pxc

一、PXC介绍 Percona Server由领先的MySQL咨询公司Percona发布。 Percona Server是一款独立的数据库产品,其可以完全与MySQL兼容,可以在不更改代码的情况了下将存储引擎更换成XtraDB 。XtraDB可以看做是InnoDB存储引擎的增强版本,它完全兼容InnoDB,且提供了很多InnoDB不具…