创建线程池的七种方式

article/2025/9/14 17:05:15

在 Java 语言中,并发编程往往都是通过床架线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景。总结来说线程池的创建可以分为两大类:

通过 Executors 创建

通过 ThreadPoolExecutor 创建

以上这两类创建线程池的方式有 7 种具体实现方法,这 7 种方法便是本文要说的创建线程池的七种方式。分别是:

方法含义
Executors.newFixedThreadPool()创建一个大小固定的线程池,可控制并发的线程数,超出的线程会在队列中等待
Executors.newCachedThreadPool()创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程
Executors.newSingleThreadExecutor()创建单个线程的线程池,可以保证先进先出的执行顺序
Executors.newScheduledThreadPool()创建一个可以执行延迟任务的线程池
Executors.newSingleThreadScheduledExecutor()创建一个单线程的可以执行延迟任务的线程池
Executors.newWorkStealingPool()创建一个抢占式执行的线程池
ThreadPoolExecutor()手动创建线程池,可自定义相关参数

Executors.newFixedThreadPool():创建一个固定大小的线程池,可控制并发的线程数。

public class FixedThreadPoolDemo {public static void main(String[] args) {// 创建 2 个线程的线程池ExecutorService threadPool = Executors.newFixedThreadPool(2);// 创建任务Runnable runnable = () -> System.out.println("任务被执行,线程:" + Thread.currentThread().getName());// 线程池执行任务(一次添加 8 个任务)threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);}}

创建一个具有 2 个线程的线程池,执行 8 个任务,执行结果为:

Executors.newCachedThreadPool():创建一个可缓存的线程池,若线程数超过人物所需,那么多余的线程会被缓存一段时间后再回收,若线程数不够,则会新建线程。

public class CachedThreadPoolDemo {public static void main(String[] args) {// 创建线程池ExecutorService threadPool = Executors.newCachedThreadPool();// 执行任务for (int i = 0; i < 5; i++) {threadPool.execute(() -> {System.out.println("任务被执行,线程:" + Thread.currentThread().getName());});}}}

创建了一个具有 5 个线程的线程池来执行相应的任务。

使用场景

CachedThreadPool 是根据短时间的任务量来决定创建的线程数量的,所以它适合短时间内有突发大量任务的处理场景。

Executors.newSingleThreadExecutor():创建只有单个线程的线程池,可以保证先进先出的顺序。

public class SingleThreadExecutorDemo {public static void main(String[] args) {// 创建线程池ExecutorService threadPool = Executors.newSingleThreadExecutor();// 执行任务for (int i = 0; i < 10; i++) {int index = i;threadPool.execute(() -> {System.out.println(index + ": 任务被执行: " + Thread.currentThread().getName());});}}}

如果在打印语句下再加一行睡眠的语句,就会看到每个一段时间输出任务被执行的过程~

try {TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {e.printStackTrace();
}

Executors.newScheduledThreadPool():创建一个可以执行延迟任务的线程池。

public class ScheduledThreadPoolDemo {public static void main(String[] args) {// 创建线程池ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(5);// 添加定时执行任务(1s 后执行)System.out.println("添加任务,时间:" + new Date());threadPool.schedule(() -> {System.out.println("任务被执行,时间:" + new Date());}, 2, TimeUnit.SECONDS);}}

创建一个延迟 2 秒执行任务的线程池。

Executors.newSingleThreadScheduledExecutor():创建一个单线程的可以执行延迟任务的线程池。这种线程池可以看做是 ScheduledThreadPool 的单线程版本。

public class SingleThreadScheduledExecutorDemo {public static void main(String[] args) {// 创建线程池ScheduledExecutorService threadPool = Executors.newSingleThreadScheduledExecutor();// 添加定时执行任务(2s 后执行)System.out.println("添加任务,时间:" + new Date());threadPool.schedule(() -> {System.out.println("任务被执行,时间:" + new Date());try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}}, 2, TimeUnit.SECONDS);}}

Executors.newWorkStealingPool():创建一个抢占式执行的线程池,执行任务的顺序不确定。需要注意的是此方法是 JDK 1.8 版本新增的,所以 1.8 版本之前的程序中不能使用。

public class WorkStealingPoolDemo {public static void main(String[] args) {// 创建线程池ExecutorService threadPool = Executors.newWorkStealingPool();// 执行任务for (int i = 0; i < 10; i++) {final int index = i;threadPool.execute(() -> {System.out.println(index + " 被执行,线程名:" + Thread.currentThread().getName());});}// 确保任务执行完成while (!threadPool.isTerminated()) {}}}

需注意与 SingleThreadExecutor 单个线程的线程池的比较。

可以看到,任务的执行顺序并不是确定的,因为这是抢占式的线程池,哪个任务抢到,哪个任务先执行。

ThreadPoolExecutor():这是最原始,也是最推荐的手动创建线程池的方法。创建时支持自定义某些属性,比如核心线程数、最大线程数等。

public class ThreadPoolExecutorDemo {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));// 执行任务for (int i = 0; i < 10; i++) {final int index = i;threadPool.execute(() -> {System.out.println(index + " 被执行,线程名:" + Thread.currentThread().getName());});}}}

创建一个具有 10 个核心线程、最大线程数为 10 的线程池。具体可设置的参数请参考:线程池七大参数_文丑颜不良啊的博客-CSDN博客

本文参考自:Java 中线程池的 7 种创建方式! - 掘金

IDEA 背景图可自取:

链接:https://pan.baidu.com/s/1wFNqHIfYKOdwE_d4BKW85A
提取码:1wo0


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

相关文章

Java中常用的四种线程池

在Java中使用线程池&#xff0c;可以用ThreadPoolExecutor的构造函数直接创建出线程池实例&#xff0c;在Executors类中&#xff0c;为我们提供了常用线程池的创建方法。 ​ 接下来我们就来了解常用的四种&#xff1a; newFixedThreadPool 首先&#xff0c;看一下这种线程池的…

5种常用的线程池

目录 0 概述1 newCachedThreadPool&#xff08;可缓存的线程池&#xff09;2 newFixedThreadPool&#xff08;固定大小的线程池&#xff09;3 newScheduledThreadPool&#xff08;可做任务调度的线程池&#xff09;4 newSingleThreadPool&#xff08;单个线程的线程池&#xff…

java中的线程池有哪些,分别有什么作用?

阅读完本篇文章会知道如下三点&#xff1a; 1.进程-线程简单介绍 2.java的线程池是什么&#xff0c;有哪些类型&#xff0c;作用分别是什么 3.使用线程池的优点 1.进程-线程的简单介绍 进程 什么是进程呢&#xff1f; 进程是计算机中的程序关于某数据集合的一次运行活动&…

线程池有几种创建方式?

总体来说线程池的创建可以分为以下两类&#xff1a; 通过 ThreadPoolExecutor 手动创建线程池通过 Executors 执行器自动创建线程池。 而以上两类创建线程池的方式&#xff0c;又有 7 种具体实现方法&#xff0c;这 7 种实现方法分别是&#xff1a; Executors.newFixedThre…

创建线程池有哪几种方式

通常开发者都是利用Executors提供的通用线程池创建方法&#xff0c;去创建不同配置的线程池&#xff0c;主要区别在于不同的 Executors目前提供了5种不同的线程池创建配置&#xff1a; 1、newCachedThreadPool&#xff08;&#xff09;&#xff0c;它是用来处理大量短时间工作…

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架构在生产线上用的更…