【Java 基础篇】Executors工厂类详解

news2024/9/27 17:31:44

在这里插入图片描述

在多线程编程中,线程池是一项重要的工具,它可以有效地管理和控制线程的生命周期,提高程序的性能和可维护性。Java提供了java.util.concurrent包来支持线程池的创建和管理,而Executors工厂类是其中的一部分,它提供了一些方便的方法来创建不同类型的线程池。本文将详细介绍Executors工厂类的使用方法和各种线程池的创建方式,以及一些注意事项和最佳实践。

Executors工厂类概述

Executors是Java中用于创建线程池的工厂类,它提供了一系列的静态工厂方法,用于创建不同类型的线程池。这些工厂方法隐藏了线程池的复杂性,使得线程池的创建变得非常简单。Executors工厂类提供的线程池有以下几种类型:

  1. newCachedThreadPool():创建一个可缓存的线程池。这个线程池的线程数量可以根据需要自动扩展,如果有可用的空闲线程,就会重用它们;如果没有可用的线程,就会创建一个新线程。适用于执行大量的短期异步任务。

  2. newFixedThreadPool(int nThreads):创建一个固定大小的线程池,其中包含指定数量的线程。线程数量是固定的,不会自动扩展。适用于执行固定数量的长期任务。

  3. newSingleThreadExecutor():创建一个单线程的线程池。这个线程池中只包含一个线程,用于串行执行任务。适用于需要按顺序执行任务的场景。

  4. newScheduledThreadPool(int corePoolSize):创建一个固定大小的线程池,用于定时执行任务。线程数量固定,不会自动扩展。适用于定时执行任务的场景。

  5. newSingleThreadScheduledExecutor():创建一个单线程的定时执行线程池。只包含一个线程,用于串行定时执行任务。

  6. newWorkStealingPool(int parallelism):创建一个工作窃取线程池,线程数量根据CPU核心数动态调整。适用于CPU密集型的任务。

接下来,我们将详细介绍每种类型线程池的创建和使用方法。

newCachedThreadPool()

newCachedThreadPool()方法创建一个可缓存的线程池,这个线程池的特点是线程数量可以根据需要自动扩展,如果有可用的空闲线程,就会重用它们;如果没有可用的线程,就会创建一个新线程。这种线程池适用于执行大量的短期异步任务,例如一些需要快速响应的网络请求处理。

创建方式

ExecutorService executorService = Executors.newCachedThreadPool();

使用示例

public class CachedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executorService.submit(() -> {
                System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
            });
        }

        executorService.shutdown();
    }
}

在上面的示例中,我们创建了一个可缓存的线程池,并提交了10个任务,线程池会根据需要自动创建新线程来执行这些任务。

newFixedThreadPool(int nThreads)

newFixedThreadPool(int nThreads)方法创建一个固定大小的线程池,其中包含指定数量的线程。线程数量是固定的,不会自动扩展。这种线程池适用于执行固定数量的长期任务,例如服务器中的后台处理任务。

创建方式

int nThreads = 5; // 指定线程数量
ExecutorService executorService = Executors.newFixedThreadPool(nThreads);

使用示例

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        int nThreads = 3;
        ExecutorService executorService = Executors.newFixedThreadPool(nThreads);

        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executorService.submit(() -> {
                System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
            });
        }

        executorService.shutdown();
    }
}

在上面的示例中,我们创建了一个固定大小为3的线程池,然后提交了10个任务。线程池会按顺序执行这些任务,每次最多有3个任务同时执行。

newSingleThreadExecutor()

newSingleThreadExecutor()方法创建一个单线程的线程池,这个线程池中只包含一个线程,用于串行执行任务。这种线程池适用于需要按顺序执行任务的场景,例如一个任务队列中的任务需要依次执行。

创建方式

ExecutorService executorService = Executors.newSingleThreadExecutor();

使用示例

public class SingleThreadExecutorExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executorService.submit(() -> {
                System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
            });
        }

        executorService.shutdown();
    }
}

在上面的示例中,我们创建了一个单线程的线程池,并提交了10个任务。线程池会按顺序执行这些任务,保证每次只有一个任务在执行。

newScheduledThreadPool(int corePoolSize)

newScheduledThreadPool(int corePoolSize)方法创建一个固定大小的线程池,用于定时执行任务。线程数量是固定的,不会自动扩展。这种线程池适用于需要定时执行任务的场景,例如定时任务调度。

创建方式

int corePoolSize = 2; // 指定线程数量
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(corePoolSize);

使用示例

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExample {
    public static void main(String[] args) {
        int corePoolSize = 2;
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(corePoolSize);

        for (int i = 0; i < 3; i++) {
            final int taskId = i;
            scheduledExecutorService.schedule(() -> {
                System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
            }, i + 1, TimeUnit.SECONDS);
        }

        scheduledExecutorService.shutdown();
    }
}

在上面的示例中,我们创建了一个固定大小为2的定时执行线程池,然后提交了3个定时任务,每个任务延迟执行的时间不同。

newSingleThreadScheduledExecutor()

newSingleThreadScheduledExecutor()方法创建一个单线程的定时执行线程池,只包含一个线程,用于串行定时执行任务。

创建方式

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

使用示例

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class SingleThreadScheduledExecutorExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

        for (int i = 0; i < 3; i++) {
            final int taskId = i;
            scheduledExecutorService.schedule(() -> {
                System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
            }, i + 1, TimeUnit.SECONDS);
        }

        scheduledExecutorService.shutdown();
    }
}

在上面的示例中,我们创建了一个单线程的定时执行线程池,并提交了3个定时任务,每个任务延迟执行的时间不同。

newWorkStealingPool(int parallelism)

newWorkStealingPool(int parallelism)方法创建一个工作窃取线程池,线程数量根据CPU核心数动态调整。这种线程池适用于CPU密集型的任务,可以充分利用多核CPU的性能。

创建方式

int parallelism = Runtime.getRuntime().availableProcessors(); // 获取CPU核心数
ExecutorService executorService = Executors.newWorkStealingPool(parallelism);

使用示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class WorkStealingPoolExample {
    public static void main(String[] args) {
        int parallelism = Runtime.getRuntime().availableProcessors();
        ExecutorService executorService = Executors.newWorkStealingPool(parallelism);

        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executorService.submit(() -> {
                System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
            });
        }

        executorService.shutdown();
    }
}

在上面的示例中,我们根据CPU核心数创建了一个工作窃取线程池,并提交了10个任务。线程池会根据CPU核心数来动态调整线程数量,以充分利用CPU的性能。

总结

Executors工厂类提供了多种线程池的创建方式,可以根据不同的需求选择合适的线程池类型。合理使用线程池可以提高程序的性能和可维护性,但也需要注意线程池的大小和资源管理,避免因线程过多导致的性能下降或资源耗尽问题。希望本文能够帮助读者更好地理解和使用Executors工厂类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1026314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库笔记

文章目录 一、初识MySQL1.1、什么是数据库1.2、数据库分类1.3、MySQL简介 二、操作数据库2.1、操作数据库&#xff08;了解&#xff09;2.2、数据库的列类型2.3、数据库的字段属性&#xff08;重点&#xff09;2.4、创建数据库表&#xff08;重点&#xff09;2.5、数据表的类型…

【PHPCUSTOM】打包PHP程序为EXE

目录 一、下载PHPCUSTOM 二、PHP网站打包 1、打开PHPCUSTOM 2、配置参数 3、生成exe文件 网上很多PHP程序打包成EXE的文章&#xff0c;但是都不能用&#xff0c;最后找到了PHPCUSTOM&#xff0c;使用PHPCUSTOM可以把PHP程序打包成exe。我们都知道PHP是服务端语言&#xff…

CCG超级标记

1. 定义 组合范畴语法&#xff08;Combinatory Categorial Grammar&#xff0c;CCG&#xff09;是一种用于自然语言语法分析的语言学理论和计算模型。它是一种形式文法&#xff0c;旨在描述句子的结构和语法规则&#xff08;通过简练的描述形式表现出句子中各成分的句法语义关…

用VS Code运行C语言(安装VS Code,mingw的下载和安装)

下载并安装VS code。 安装扩展包&#xff1a; 此时&#xff0c;写完代码右键之后并没有运行代码的选项&#xff0c;如图&#xff1a; 接下来安装编译器mingw。 下载链接&#xff1a; https://sourceforge.net/projects/mingw-w64/ 得到压缩包&#xff1a; 解压&#xff1a; …

车载通信架构 —— SOME/IP 协议概述

车载通信架构 —— SOME/IP 协议概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 对学习而言,学习之后的思考、思考之后的行动、行动之后的改变更重要,如果不盯住内层的改变量,那么在表层投…

浅谈DBT的一些不足之处

DBT的好处是显而易见的&#xff0c;它支持连接多达41种数据库。而且不需要你写DDL语句&#xff0c;只要写select语句&#xff0c;DBT会自动帮你推断schema结构&#xff0c;将数据写入到数据库中&#xff1a; 但是使用了一段时间之后&#xff0c;发现DBT也存在着如下这些不足之处…

YOLOv5、YOLOv8改进:HorNet完全替换backone

1.简介 论文地址&#xff1a;https://arxiv.org/abs/2207.14284 代码地址&#xff1a;https://github.com/raoyongming/HorNet 视觉Transformer的最新进展表明&#xff0c;在基于点积自注意力的新空间建模机制驱动的各种任务中取得了巨大成功。在本文中&#xff0c;作者证明了…

pcl--第七节 点云配准

点云配准原理概述 点云配准需求场景 ​ 随着计算机辅助设计技术的发展&#xff0c;通过实物模型产生数字模型的逆向工程技术获得了越来越广泛的应用&#xff0c;与此同时&#xff0c;硬件设备的日趋完善也为数字模型操作提供了足够的技术支持。 ​ 由于三维扫描仪设备受到测…

win系统环境搭建(九)——Windows安装chatGPT

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;九&#xff09;——Windows安装chatGPT 本系列windows环境搭建开始讲解如何给win系统搭建环境&#xff0c;本人所用系统是腾讯云服务器的Windows Server 2022&#xff0c;你可以理解成就是你用的windows…

FFmpeg5.1.3编译动态库详细教程(基于Linux虚拟机)

FFmpeg编译详细教程 FFmpeg编译详细教程 本文原创&#xff1a;猿视野 ( 一家分享技术架构思路,扩展程序员视野的网站,遇到技术问题&#xff0c;可以加联系方式相互交流) 转载请注明出处和相关链接&#xff0c;否则追究其法律责任&#xff01; 原文地址&#xff1a;https://dev…

MyBatis之增删查改功能

文章目录 一、创建各种类二、MyBatis的各种功能 1、查询<select>2、增加<insert>3、修改<update>4、删除<delete>三、总结 前言 在MyBatis项目中编写代码实现对MySql数据库的增删查改 一、创建各种类 1、在Java包的mapper文件下创建一个接口 我创建…

“毛细血管”的进化:华为分销业务如何让伙伴也有“高能级”

作者 | 曾响铃 文 | 响铃说 数字化蓬勃发展的大时代&#xff0c;除了那些中、大型企业&#xff0c;数量更为庞大的小微企业同样有借助数字化产品、服务来提升企业经营的需求&#xff0c;由此也带来了广袤的数字化分销市场。 这里处在聚光灯之外&#xff0c;很少被数字化时代…

PyCharm安装教程,新手详细

首先进入官网&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows#sectionwindows 然后选择版本&#xff0c;我下载的是社区版&#xff0c;一般学习是够了 然后点击Download进行下载。 双击exe运行 然后选择安装路径&#xff0c;建议放在D盘 然后这…

找不到msvcp140.dll的解决方法,以及msvcp140.dll丢失的原因

在计算机使用过程中&#xff0c;我们可能会遇到无法启动程序的问题&#xff0c;提示找不到 msvcp140.dll。这使得许多用户感到困扰&#xff0c;因为 msvcp140.dll 是 Microsoft Visual C Redistributable 的一个组件&#xff0c;它包含了 C 运行时库。这个库对于许多应用程序和…

SpringCLoud——RabbitMQ的消息模型

Work Queue工作队列 他的主要作用就是增加消费者的个数&#xff0c;可以提高消息处理速度&#xff0c;避免队列消息堆积。 案例 实现一个队列绑定多个消费者 首先修改一下之前的发送消息的代码&#xff0c;让他循环发送50次&#xff0c;但是不要一次性发完&#xff1a; Tes…

React(react18)中组件通信04——redux入门

React&#xff08;react18&#xff09;中组件通信04——redux入门 1. 前言1.1 React中组件通信的其他方式1.2 介绍redux1.2.1 参考官网1.2.2 redux原理图1.2.3 redux基础介绍1.2.3.1 action1.2.3.2 store1.2.3.3 reducer 1.3 安装redux 2. redux入门例子3. redux入门例子——优…

【算法】二分答案

文章目录 相关链接什么时候使用二分答案&#xff1f;题目列表最大化最小化相关题目列表&#x1f4d5;2439. 最小化数组中的最大值解法1——二分答案解法2——分类讨论O(n) 2513. 最小化两个数组中的最大值&#xff08;二分答案lcm容斥原理&#xff09;&#x1f402;好题&#x…

每日练习-8

目录 一、选择题 二、算法题 1.另类加法 2、走方格的方案数 一、选择题 1、 解析&#xff1a;当使用new运算符创建一个类的对象数组时&#xff0c;会调用该类的构造函数来初始化每个对象。因此&#xff0c;如果创建了5个对象&#xff0c;那么构造函数会被调用5次。 当使用delet…

[2023.09.20]:Yew的前端开发经历小结

今天基本上完成了一个操作闭环&#xff0c;即能够保存&#xff0c;拉取和删除数据。截个图 这个过程的前端和后端都是用Rust写的&#xff0c;前端使用的是Yew。 Yew是一种用于构建现代Web应用程序的Rust框架&#xff0c;其计目标是提供一种安全、高效、易用的方式来构建Web应…

智慧公厕:改变公共厕所管理与运营的未来

在现代社会中&#xff0c;公共厕所是城市建设的重要组成部分。然而&#xff0c;长期以来&#xff0c;公共厕所管理与运营一直是一个令人头疼的问题。由于各种原因&#xff0c;公共厕所常常陷入管理难、环境差、设备设施陈旧的状态&#xff0c;给人们的生活带来困扰。然而&#…