Java 线程池之SingleThreadExecutor

引言

在并发编程中,线程池是一种常用的资源管理模式,能够有效地管理和复用线程资源,提高系统性能和资源利用率。Java 提供了多种类型的线程池,其中 SingleThreadExecutor 是一种特殊的线程池实现,它只有一个工作线程,确保所有任务按顺序执行。本文将详细介绍 SingleThreadExecutor 的概念、使用场景、配置及示例代码。

什么是 SingleThreadExecutor

SingleThreadExecutor 是 Java 并发包(java.util.concurrent)中的一种线程池实现。它内部只有一个工作线程,所有提交的任务将按照提交的顺序依次执行。SingleThreadExecutor 确保任务不会并发执行,因此非常适用于需要按顺序执行任务的场景。

创建 SingleThreadExecutor

使用 Executors 工具类

可以通过 Executors 工具类的工厂方法 newSingleThreadExecutor 来创建一个单线程执行器:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SingleThreadExecutorExample {public static void main(String[] args) {ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();for (int i = 0; i < 5; i++) {int taskId = i;singleThreadExecutor.execute(() -> {System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行时间} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}singleThreadExecutor.shutdown();}
}

在上述代码中,Executors.newSingleThreadExecutor() 创建了一个单线程执行器,并通过 execute 方法提交了一些任务进行执行。

工作原理

SingleThreadExecutor 内部使用一个工作线程来执行所有提交的任务。任务被放入一个无界队列中,工作线程从队列中依次取出任务并执行。由于只有一个工作线程,因此所有任务都是按顺序执行的,不存在并发执行的情况。

使用场景

顺序执行任务

SingleThreadExecutor 非常适用于需要按顺序执行任务的场景。例如,日志记录、文件写入等任务需要保证顺序性。

保证线程安全

在某些场景中,使用 SingleThreadExecutor 可以简化线程安全问题。由于只有一个线程执行任务,因此不需要担心多个线程同时访问共享资源的问题。

简化复杂逻辑

在处理一些复杂逻辑时,通过 SingleThreadExecutor 可以保证任务按顺序执行,从而简化代码逻辑和调试过程。

注意事项

任务队列的限制

SingleThreadExecutor 使用一个无界队列来存储任务。如果任务提交的速度快于任务执行的速度,可能会导致队列中的任务不断增加,占用大量内存。因此,需要注意任务提交的速率,避免内存耗尽。

处理任务中的异常

在使用 SingleThreadExecutor 时,应注意处理任务中的异常。未处理的异常可能会导致工作线程终止,从而影响后续任务的执行。例如,可以通过捕获 Runnable 任务中的异常来确保线程继续执行其他任务:

Runnable safeTask = () -> {try {System.out.println("Task is running by " + Thread.currentThread().getName());// 模拟任务执行时间Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();} catch (Exception e) {System.err.println("Task encountered an error: " + e.getMessage());}
};

优雅关闭线程池

在使用完线程池后,应调用 shutdown() 方法来优雅地关闭线程池,确保所有已提交的任务都能执行完毕:

singleThreadExecutor.shutdown();
try {if (!singleThreadExecutor.awaitTermination(60, TimeUnit.SECONDS)) {singleThreadExecutor.shutdownNow();}
} catch (InterruptedException e) {singleThreadExecutor.shutdownNow();Thread.currentThread().interrupt();
}

示例代码

以下是一个使用 SingleThreadExecutor 的完整示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class SingleThreadExecutorExample {public static void main(String[] args) {ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();for (int i = 0; i < 5; i++) {int taskId = i;singleThreadExecutor.execute(() -> {System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行时间} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}singleThreadExecutor.shutdown();try {if (!singleThreadExecutor.awaitTermination(60, TimeUnit.SECONDS)) {singleThreadExecutor.shutdownNow();}} catch (InterruptedException e) {singleThreadExecutor.shutdownNow();Thread.currentThread().interrupt();}}
}

在上述代码中,我们使用 Executors.newSingleThreadExecutor() 创建了一个单线程执行器,并提交了一些任务进行执行。任务按顺序执行,确保所有任务依次完成。

结论

SingleThreadExecutor 是 Java 并发包中一种简单而有效的线程池实现,适用于需要顺序执行任务的场景。通过合理配置和管理 SingleThreadExecutor,可以有效提高系统的性能和任务执行的可靠性。理解并正确使用 SingleThreadExecutor,可以帮助开发者编写高效且稳定的并发程序。

希望本文能帮助你理解 SingleThreadExecutor 的基本概念及其使用方法。如果你有任何问题或建议,欢迎留言讨论。

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

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

相关文章

人脉社群平台微信小程序系统源码

&#x1f31f;【解锁人脉新纪元&#xff1a;探索人脉社群平台小程序】&#x1f31f; &#x1f680;【开篇&#xff1a;为什么我们需要人脉社群平台小程序&#xff1f;】&#x1f680; 在这个快节奏的时代&#xff0c;人脉不再是简单的名片交换&#xff0c;而是通往成功与机遇…

昇思25天学习打卡营第17天|ChatGLM-6B聊天demo

一、简介&#xff1a; 本次实验&#xff0c;基于MindNLP和ChatGLM6B模型搭建一个小的聊天应用&#xff0c;ChatGLM6B 是基于 GLM-4 模型开发的开源对话机器人&#xff0c;拥有 62 亿个参数&#xff0c;能够进行自然流畅的语言交流。在对话中&#xff0c;ChatGLM6B 可以胜任文案…

我关于Excel使用点滴的笔记

本篇笔记是我关于Excel使用点滴的学习笔记&#xff0c;摘要和地址链接列表。临时暂挂&#xff0c;后面可能在不需要时删除。 (笔记模板由python脚本于2024年06月28日 12:23:32创建&#xff0c;本篇笔记适合初通Python&#xff0c;熟悉六大基本数据(str字符串、int整型、float浮…

(2024)KAN: Kolmogorov–Arnold Networks:评论

KAN: Kolmogorov–Arnold Networks: A review 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. MLP 也有可学习的激活函数 2. 标题的意义 3. KAN 是具有样条基激活函数的 M…

Python使用多线程并发测试FastDFS文件上传、删除

代码如下&#xff1a; # main.py import functools import itertools import json import os import sys import time from pathlib import Path from typing import Callable, TypeVar# pip install asynctor httpx rich fastdfs-client from asynctor import bulk_gather, r…

深入理解Symfony调试工具:从原理到实践

引言 Symfony&#xff0c;作为一个功能强大的PHP框架&#xff0c;提供了一整套工具来帮助开发者在开发过程中进行调试。其中&#xff0c;调试工具是Symfony生态中不可或缺的一部分&#xff0c;它允许开发者实时查看应用程序的状态&#xff0c;包括但不限于变量值、服务调用、事…

python通过COM Interface控制CANoe

python通过COM Interface控制CANoe 介绍打开示例工程python代码示例介绍 通过python可以控制CANoe的启动和停止等其他操作,在做高阶的自动化项目时可以用到。 打开示例工程 python代码示例 # --------------------------------------------------------------------------…

卫星网络——Walker星座简单介绍

一、星座构型介绍 近年来&#xff0c;随着卫星应用领的不断拓展&#xff0c;许多任务已经无法单纯依靠单颗卫星来完成。与单个卫星相比&#xff0c;卫星星座的覆盖范围显著增加&#xff0c;合理的星座构型可以使其达到全球连续覆盖或全球多重连续覆盖&#xff0c;这样的特性使得…

Redis三种模式——主从复制、哨兵模式、集群

一、Redis模式 Redis有三种模式&#xff1a;分别是主从同步/复制、哨兵模式、Cluster 主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和群集都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简…

使用Python进行计算机视觉

哈喽,大家好,我是木头左! 简介 计算机视觉是一门研究如何使机器“看”世界的科学。它涉及到图像处理、模式识别、机器学习等多个领域。近年来,随着深度学习的发展,计算机视觉取得了显著的进步。Python作为一门广泛应用于数据科学和人工智能的编程语言,为计算机视觉提供了…

关于ORACLE单例数据库中的logfile的切换、删除以及添加

一、有关logfile的状态解释 UNUSED&#xff1a; 尚未记录change的空白group&#xff08;一般会出现在loggroup刚刚被添加&#xff0c;或者刚刚使用了reset logs打开数据库&#xff0c;或者使用clear logfile后&#xff09; CURRENT: 当前正在被LGWR使用的gro…

深入理解【 String类】

目录 1、String类的重要性 2、常用方法 2、1 字符串构造 2、2 String对象的比较 2、3 字符串查找 2、4字符转换 数值和字符串转换&#xff1a; 大小写转化&#xff1a; 字符串转数组&#xff1a; 格式转化&#xff1a; 2、5 字符串替换 2、6字符串拆分 2、7 字符串…

Mysql中间件和高可用

文章目录 一、MySQL中间件代理服务器MycatMycat应用场景Mycat部署 实现读写分离 二、MySQL高可用高可用解决方案MHA高可用实现MHA 一、MySQL中间件代理服务器 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库&#xff08;非关系型数据库&#xff09;。 数据库主…

ATFX汇市:美国大非农数据来袭,美指与欧元或迎剧烈波动

ATFX汇市&#xff1a;今日20:30&#xff0c;美国劳工部将公布6月非农就业报告&#xff0c;其中新增非农就业人口数据最受关注&#xff0c;前值为27.2万人&#xff0c;预期值19万人&#xff0c;预期降幅高达8.2万人。如果公布值确实如预期一般&#xff0c;美联储降息预期将增强&…

以太网协议介绍——UDP

注&#xff1a;需要先了解一些以太网的背景知识&#xff0c;方便更好理解UDP协议、 以太网基础知识一 以太网基础知识二 UDP协议 UDP即用户数据报协议&#xff0c;是一种面向无连接的传输层协议&#xff0c;属于 TCP/IP 协议簇的一种。UDP具有消耗资源少、通信效率高等优点&a…

跟着峰哥学java 微信小程序 第二天 封装ES7 + 后端工作

1.前端 1.1使用promise封装 使用promise封装以至于在图片路径 统一路径中修改 //封装统一请求域名 const baseUrl "http://localhost:8080"; //封装后需导出 export const getBaseUrl()>{return baseUrl; } 导入外来资源 初始化数据 设置数据 将处理后的数据…

力扣热100 滑动窗口

这里写目录标题 3. 无重复字符的最长子串438. 找到字符串中所有字母异位词 3. 无重复字符的最长子串 左右指针left和right里面的字符串一直是没有重复的 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 左右指针leftright0ans0#初始化结果tablecolle…

AIGI赋能未来:人工智能如何重塑电子电路学习体验

文章目录 一、掌握基础知识与技能1. 扎实理论基础2. 熟练使用工具 二、融合AI技术提升学习效率1. 利用AI辅助学习平台2. 应用AI工具进行电路设计与仿真 三、探索创新应用方向1. 关注AI与电子电路的交叉领域2. 参与开源项目和竞赛 四、培养跨学科思维1. 加强数学与计算机科学知识…

javax.net.ssl.SSLHandshakeException: 解决方式

请求第三方接口的时候报javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 网站与…

解决使用PPIO欧派云服务器时无法使用sftp的问题

首先在对外TCP端口中选择22端口&#xff1a; 在连接-端口映射中可以看到&#xff1a; 使用ssh连接云服务器&#xff0c;更新包列表并安装OpenSSH服务器&#xff1a; apt-get update apt-get install-y openssh-server 创建 SSH 运行目录&#xff1a; mkdir /var/run/sshd 设…