赶紧收藏!2024 年最常见 100道 Java 基础面试题(二十三)

上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(二十二)-CSDN博客

四十五、线程池都有哪些状态?

在Java中,线程池(ThreadPoolExecutor)的状态与Java的线程状态是不同的。线程池的状态主要指的是线程池的生命周期状态,它定义了线程池对提交的任务的处理方式。以下是线程池的几种状态:

  1. 运行(Running)

    • 在这个状态下,线程池可以接受新的任务,也可以处理阻塞队列中的等待任务。
  2. 关闭(Shutting Down)

    • 线程池的shutdown()方法被调用后,线程池进入关闭状态。此时,线程池不再接受新任务,但会处理阻塞队列中的已提交任务。
  3. 停止(Stop)

    • 当调用线程池的shutdownNow()方法时,线程池会尝试停止处理等待任务,并尝试停止所有正在执行的任务。此时线程池的状态是停止。shutdownNow()会尝试立即停止所有活动执行的任务。
  4. 阻塞(Blocked)

    • 线程池的状态并不包括阻塞,但如果所有线程都忙碌,且队列已满,那么线程池在处理任务时可能会表现出阻塞的特性。
  5. 终止(Terminated)

    • 线程池在执行完所有提交的任务后,可以变为终止状态。线程池的isTerminating()方法可以用来判断线程池是否在终止过程中。
  6. 等待(Waiting)

    • 线程池的状态并不包括等待,但线程池中的线程在没有任务可执行时,会处于等待状态,直到有新的任务到来或线程池被关闭。

线程池状态转换和相关方法

  • 启动:当线程池被创建,并且至少有一条线程在运行时,线程池就处于运行状态。
  • 关闭:调用shutdown()方法会关闭线程池,不再接受新任务,但会处理队列中的等待任务。
  • 立即停止:调用shutdownNow()方法会让线程池尝试立即停止,并中断正在执行的任务。
  • 终止:当线程池中的所有任务都已完成,且所有线程都已停止时,线程池变为终止状态。

示例代码

import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;

public class ThreadPoolStatusExample {
    public static void main(String[] args) {
        ExecutorService executor = new ThreadPoolExecutor(
            3, // core pool size
            10, // maximum pool size
            60L, // keep-alive time
            TimeUnit.SECONDS, // time unit
            new LinkedBlockingQueue<Runnable>() // work queue
        );

        // 关闭线程池,不再接受新任务,但处理等待任务
        executor.shutdown();

        // 尝试立即停止,中断正在执行的任务
        executor.shutdownNow();

        // 判断线程池是否终止
        ((ThreadPoolExecutor) executor).isTerminating();
    }
}

总结

  • 线程池的状态反映了线程池的生命周期,从运行到关闭,再到终止。
  • 线程池的状态转换由相应的线程池控制方法触发,如shutdown()shutdownNow()
  • 了解线程池的状态对于正确管理线程池和任务调度非常重要。

四十六、线程池中submit()execute()方法有什么区别?

在Java的java.util.concurrent包中,ThreadPoolExecutor类提供了两个关键的方法来提交任务:submit()execute()。这两个方法都用于向线程池提交任务,但它们之间存在一些差异:

  1. 返回类型

    • submit()方法的返回类型是Future<?>,它允许你获取任务执行的结果,或者在任务完成前取消任务。
    • execute()方法不接受返回值,也不提供Future对象,因此你无法通过它来获取任务的执行结果或取消任务。
  2. 任务结果

    • 使用submit()方法,你可以获取任务执行的结果,特别是当任务是一个Callable对象时。这使得submit()适用于那些需要返回值的异步任务。
    • execute()方法主要用于那些不需要返回结果的Runnable任务。
  3. 异常处理

    • submit()方法中,如果任务在执行过程中抛出异常,异常会被捕获并作为Future的一部分,你可以通过调用Future.get()方法来获取这个异常。
    • execute()方法中,如果任务抛出异常,异常会由线程池内部处理,除非线程池的RejectedExecutionHandler有特殊的处理逻辑,否则你无法直接感知到这个异常。
  4. 任务调度

    • submit()方法可以用于执行CallableRunnable任务,而execute()方法只能执行Runnable任务。
  5. 线程池关闭后的行为

    • 当线程池关闭后,submit()方法会抛出RejectedExecutionException,因为它尝试向线程池提交任务。
    • execute()方法在线程池关闭后的行为取决于线程池的状态和具体实现,但通常也会拒绝新任务的提交。
  6. 示例代码

  7. import java.util.concurrent.*;
    
    public class ThreadPoolSubmitExecuteExample {
        public static void main(String[] args) {
            ExecutorService executorService = Executors.newFixedThreadPool(3);
    
            // 使用submit()提交任务
            Future<?> future = executorService.submit(() -> {
                System.out.println("Task submitted with a Future");
            });
            // 可以调用future.get()来获取任务执行结果或异常
    
            // 使用execute()提交任务
            executorService.execute(() -> {
                System.out.println("Task executed without a Future");
            });
            // 不能获取任务执行结果或取消任务
    
            executorService.shutdown();
        }
    }

总结

  • submit()方法适用于需要获取任务结果或对任务进行取消的场景,它返回一个Future对象。
  • execute()方法适用于不需要任务结果的简单任务执行,它不返回任何内容。
  • 在设计线程池任务提交逻辑时,应根据任务是否需要返回结果或是否需要支持任务取消来选择合适的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的校园疫情防控系统设计与实现

基于Spring Boot的校园疫情防控系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录首页界面图&#xff0c;管理员进入校园疫…

AI大模型探索之路-训练篇10:大语言模型Transformer库-Tokenizer组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

msmpi 高性能并行计算 移植并行细胞自动机报错

报错情况如图 代码来源 元胞自动机生命游戏C语言并行实现 – OmegaXYZ 稍微修改&#xff0c;因为相对路径在 msmpi 10.1.1 中失效 Microsoft Windows [版本 10.0.22000.2538] (c) Microsoft Corporation。保留所有权利。C:\Users\ASUS>mpiexec -n 9 "C:\Users\ASUS\D…

四信数字孪生水库解决方案,加快构建现代化水库运行管理矩阵

近年&#xff0c;水利部先后出台《关于加快构建现代化水库运行管理矩阵的指导意见》与《构建现代化水库运行管理矩阵先行先试工作方案》等文件&#xff0c;明确总体要求及试点水库、先行区域建设技术要求等&#xff0c;为全面推进现代化水库运行管理矩阵建设工作提供依据。 《2…

自定义Maven项目模板Archetype,快速创建模板项目。

自定义Archetype 创建好模板项目&#xff0c;在项目根目录执行命令对模板做出响应调整将模板安装到本地、远程仓库使用自定义模板 创建好模板项目&#xff0c;在项目根目录执行命令 mvn archetype:create-from-project对模板做出响应调整 如果是多模块项目&#xff0c;可能需…

【数据结构】:链表的带环问题

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构 &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 链表的带环问题在链表中是一类比较难的问题&#xff0c;它对我们的思维有一个比较高的要求&#xff0c;但是这一类…

【模板】前缀和

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和模板题。 前缀和中数组下标为1~n。 前缀和&#xff1a;pre[i]pre[i-1]a[i]; 某段区间 [l,r]的和&#xff1a;pre[r]-pre[l-1] 3.…

【C语言】atoi和atof函数的使用

人生应该树立目标&#xff0c;否则你的精力会白白浪费。&#x1f493;&#x1f493;&#x1f493; 目录 •&#x1f319;知识回顾 &#x1f34b;知识点一&#xff1a;atoi函数的使用和实现 • &#x1f330;1.函数介绍 • &#x1f330;2.代码演示 • &#x1f330;3.atoi函数的…

【高校科研前沿】云南大学陈峰研究员联合多家单位在Sci. Bull发文揭示了明末特大干旱背景下北京降水变化及其以太平洋海温变化为主导的驱动新机制

文章简介 论文名称&#xff1a;Coupled Pacific Rim megadroughts contributed to the fall of the Ming Dynasty’s capital in 1644 CE&#xff08;环太平洋地区的特大干旱影响了公元 1644 年明朝的灭亡&#xff09; 第一作者及通讯作者&#xff1a;陈峰研究员&王涛研究…

38-4 Web应用防火墙 - WAF的使用及规则

准备:38-3 Web应用防火墙 - 安装配置WAF-CSDN博客 WAF的使用 启动 Nginx /usr/local/nginx/sbin/nginx 为了测试未启动 ModSecurity 时的访问效果,我们可以模拟攻击。要查看当前虚拟机的 IP 地址,可以使用命令 ifconfig 浏览器中访问ip,如果要在真实机中访问就需要关闭…

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念&#xff08;了解&#xff09; 基本上 vi 可以分为三种状态&#xff0c;分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode)&#xff0c;各模式的功能区分如下: 命令行模式 command mode&#xff09;  控制屏幕光标的移动&a…

c3 笔记7 css基本语法

相关内容&#xff1a;字体、段落、词间距、文字效果&#xff08;对齐、上下标、阴影&#xff09;、背景图、背景渐变、…… 单位pt与px的差别pt是印刷使用的字号单位&#xff0c;不管屏幕分辨率是多少&#xff0c;打印到纸上看起来都是相同的&#xff0c;lot的长度是0.01384英寸…

[PS小技能学习]抠图和切图

详情见视频教程&#xff1a;PS小技巧--抠图与切图 今天我们来学习如何使用PS对表情包合辑进行抠图和裁剪保存 1、首先&#xff0c;将图片导入&#xff0c;双击图层新建一个图层 2、然后点击工具栏的魔棒工具&#xff0c;再点击顶部菜单栏的添加到选区 3、点击图片的空白区域即…

《QT实用小工具·五十一》带动画的 CheckBox

1、概述 源码放在文章末尾 该项目实现了带动画效果的多选框&#xff0c;鼠标放在上面或者选中都会呈现炫酷的动画效果&#xff0c;demo演示如下&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LINEARCHECKBOX_H #define LINEARCHECKBOX_H#include <QCheckBox> …

C/C++不定参函数使用

C语言中不定参函数的使用和访问 例子 例如&#xff0c;这里想写一个打印的函数&#xff0c;但是参数并不确定该怎么办呢&#xff0c;这就要用到不定参函数 #include<stdarg.h> void printNum(int count,...){va_list ap;va_start(ap,count);//获取指定参数的起始地址&…

【CTF Reverse】XCTF GFSJ0492 insanity Writeup(反汇编+字符串搜索)

insanity 菜鸡觉得前面的题目太难了&#xff0c;来个简单的缓一下 解法 拖进 Exeinfo PE 中分析。 -> Compiler : GCC: (Debian 4.4.7-2) 4.4.7用 IDA 打开。 按 shift F12 打开 String 页面。找到 flag。 Flag 9447{This_is_a_flag}声明 本博客上发布的所有关于网络攻…

Java创建并遍历N叉树(前序遍历)

力扣 title589&#xff1a;N叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 思路&#xff1a; 1.初始化时…

电脑自带dll修复在哪里,使用dll修复工具解决dll问题

在我们日常与电脑相伴的工作与学习过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“无法找到.dll”或“找不到.dll文件”。这种情况通常是由于dll文件丢失或损坏导致的。dll文件是动态链接库文件&#xff0c;它包含了许多程序运行所需的函数和资源…

Ant Design助力:实现用户列表的优雅展示与管理

文章目录 概要前端讲解登录组件注册组件用户列表组件 后端讲解连接数据库db.js路由routes.jsexpress应用app.js 启动项目小结 概要 在上一篇博客&#x1f6aa;中&#xff0c;我们已经成功实现了登录注册系统的基本功能。现在&#xff0c;我们将进一步完善系统&#xff0c;实现…

File contains parsing errors: file:///etc/yum.repos.d/nginx.repo报错解决,文件配置出现问题

执行yum指令出现以下错误&#xff1a; 解决方案&#xff1a;yum的配置文件出现问题&#xff0c; 先删除yum.repos.d目录下所有文件 rm -f /etc/yum.repos.d/* 然后重新下载阿里的资源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.…
最新文章