Java小问答--线程池相关的一些问题

news2025/1/12 6:46:13
  • 1.为什么需要线程池呢,它有哪些好处?

答:线程在创建并执行时会从用户态进入到内核态,这个过程会非常影响效率,有时这个过程可能甚至比执行线程内的代码还要费时费力,所以,为了解决这种问题,我们就需要引入线程池了。

线程池可以使我们创建好的线程被多次使用,使单个线程不再只能执行一个任务,进而大大提高我们的效率。不仅如此,通过对线程池的理解和方法的运用,我们也可以对我们的多线程程序有更好的掌控。

  • 2.尝试使用自己的理解来说明一下手动创建线程池需要的7个参数(英文不说也行,主要是参数的作用)

答:首先是核心线程数(int corePoolSize),也就是线程的下限

接下来是最大线程数(int maximumPoolSize ),即线程的上限

然后是空闲时的等待时间(long keepAliveTime ),线程如果没有活干了,就会加入等待队列,超过传入等待时间后,就会自动销毁了。

再往下是等待时间的单位(TimeUnit unit),可以是秒、分、小时等等

剩下的两个参数分别是进程工厂(ThreadFactory threadFactory)和拒绝策略(RejectedExecutionHandler handler),这两个都不是必须传入的,我们可以根据需求自定义进程工厂或是拒绝策略,也可以不传入参数,线程池会使用默认的进程工厂和拒绝策略来进行处理。

进程工厂用来创建新的进程

当任务队列已满并且进程池内的进程数量达到上限还都在忙碌时,程序则会采取拒绝策略,拒绝新任务的加入

juc提供了多种拒绝策略:

AbortPolicy  拒绝任务,并抛出异常

DiscardPolicy 拒绝任务,没有任何提示

DiscardOldestPolicy 拒绝最总加入等待瑞列的任务,新任务加入队列

CallerRunsPolicy 拒绝任务,将任务交还给发起任务的线程

我们也可以通过重写方法来自定义自己的拒绝策略

  • 3.试着解释一下线程池的内部机制

答:如图所示,每当新任务准备执行时,我们先看此时的线程数量是否达到下限,如果没达到,就新建一个线程,用来执行任务。如果已经达到了下限,代表此时线程足够,不需要创建新线程了,我们就看任务队列是否还有空闲,如果有空闲就把它加入任务队列,等待执行,如果任务队列也满了,代表线程忙不过来了,我们就看看线程数量是否达到上限,如果未达上限,我们就新建一个线程用来处理这个任务,如果列表也满了,线程也达到上限了,我们就无法完成这个任务了,此时我们只能采用拒绝策略,来拒绝这个任务了。

现在我们回到之前,假设在进入进程池后,任务已经被成功完成了,此时线程就会前往任务队列查看是否还有待完成的任务了,如果有,我们就继续取出一个任务执行,循环往复这个过程,直到任务列表被执行完毕,如果队列里已经没有任务了,代表工作告一段落了,线程会进入等待队列等待新任务的出现,如果在传入的等待时间内,始终没有新的任务出现,通常来讲,超过下限的线程将会被销毁。

  • 4.使用线程池的submit方法时,传入的参数根据实现Runnable和Callable接口的不同,所产生的效果有哪些差异呢?

不管我们的对象实现的是Runnable还是Callable接口,如果我们执行后都不需要获得任何返回值,那么在使用submit方法后基本相同,我们都会获得一个Future对象,都可以使用Future的isDone方法来判断线程是否执行完毕,但如果想获得执行后的结果,就只有实现Callable接口的对象可以使用Future的get方法获得返回值了。

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

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

相关文章

上传文件到github仓库

REF: https://blog.csdn.net/litianxiang_kaola/article/details/74075151 已有repository,往仓库里更新内容 点击gitlab里的clone 在git bash中使用git clone,这个时候会将网上的仓库下载到本地,你可以把想要更新的内容直接拖到仓库里 …

Apache CloudStack Official Document 翻译节选(八)

关于 Apache CloudStack 的 最佳实践 (二) 防火墙的设定 Hardware Firewall 部署Apache CloudStack时,建议部署一套防火墙系统已保护Apache CloudStack的云管理服务。在防火墙的选用方面,既可以使用通用防火墙、也可以使用诸如Ju…

【算法】二叉树(满二叉树和完全二叉树)、堆(堆的向下调整)、堆排序、堆的内置模块heapq

1 二叉树 1.1 满二叉树和完全二叉树 1.2 堆的向下调整 2 堆排序 3 堆的内置模块 1 二叉树 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见类型包括: 1. **普通二叉树**:任意一…

在 uboot 中实现 UDP 协议

一、明确背景 uboot中有许多通信协议,像TFTP、NFS等,这些协议底层都是基于UDP协议来实现的,由于有一个板子在 uboot 段进行固件下载更新的需求,本来想基于TCP协议来实现自定义通信协议(TCP有自带的拥塞控制和重传机制&…

Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?

这些是Microsoft Visual C的不同版本的Redistributable(可再发行组件包)安装包,用于在用户的计算机上安装或更新必要的运行时库,以便运行使用这些版本的Visual C开发的应用程序。具体来说: Microsoft Visual C 2012 R…

编译linux内核时,让版本号不跟着git变化

文章目录 编译linux内核时,让版本号不跟着git变化现象方法一方法二 编译linux内核时,让版本号不跟着git变化 现象 内核每次重新编译时,uname -r都会跟着变。 4.1.15-00005-g482731e4-dirty 导致报错,modprobe: can’t change …

《深入理解Java虚拟机(第2版)》- 第1章 - 学习笔记

1.1 概述 Java不止是一门编程语言,它是一些列计算机软件和规范所形成的技术体系。 1.2 技术体系 Sun官方定义Java技术体系由5各部分组成,如下: Java编程语言JVMClass文件格式Java API 类库第三方Java类库(商业或开源&#xff…

养猫家庭必备好物——宠物空气净化器,让浮毛无处可逃

前不久,我爸妈担心我独自一个人来到一个陌生的城市打拼,身边没人陪我会孤单,但其实我一点儿都不孤单。虽然我家里没有人陪我聊天说话一起做饭,但是有猫陪我。 之前来到这座城市的第二年就养了猫,心情确实好很多&#…

【数据分享】《中国奶业年鉴》2002-2020(缺2014)

而今天要限时免费分享的数据就是2002-2020年间出版的《中国奶业年鉴》并以多格式提供免费下载。(无需分享朋友圈即可获取) 数据介绍 《中国奶业年鉴》是反映我国奶业发展情况的综合性年刊,也是农业农村部(原农业部&#xff0…

13、java 数组常见算法(经典案例)、Arrays类的使用(操作数组工具类)、数组常见异常(角标越界或空指针)

java 数组 Ⅰ、数组常见算法:1、二维数组的案例1:求和其一、代码为:其二、截图为: 2、二维数组的案例2:杨辉三角其一、描述:其二、代码为:其三、截图为: 3、二维数组的案例3&#xf…

如何使用jd-gui对springboot源码进行分析

背景: 最近在学习springboot的过滤器和拦截器,想了解一下过滤器和拦截器是怎么匹配URL的,在网上搜了半天都搜不到针对源码的,网上大部分内容都是说怎么配置过滤器和拦截器,怎么使用,并没有对源码进行分析的…

10分钟出稿!分享最佳6款AI智能一键生成毕业论文

在当前的学术环境中,AI智能写作工具已经成为许多学生和研究人员的重要助手。这些工具不仅能够帮助快速生成论文初稿,还能提供文献综述、语法检查等多种功能,极大地简化了学术写作流程。以下是六款最佳AI智能一键生成毕业论文的推荐&#xff1…

大学生实用工具!分享5款靠谱AI一键生成毕业论文的网站

对于大学生来说,毕业论文是一项重要的学术任务,但往往也是最令人头疼的部分。幸运的是,随着人工智能技术的发展,现在有一些工具可以帮助学生轻松完成论文。以下是五款靠谱的AI一键生成毕业论文的网站,其中特别推荐千笔…

EXCEL格式转化

1.小数位的保留 ROUND 四舍五入, ROUNDUP向上进一位 ROUNDDOWN向下进一位 2.货币符号与单位的添加 CTRLSHIFT4自定义格式,只改变显示,不改变数值 DOLLAR,RMB 3.英文大小写转化 UPPER小写变大写 LOWER大写变小写 PROPER首字母大写 …

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 自定义范围后处理效果(优化版)

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 自定义范围后处理效果(优化版) 核心代码完整代码在线示例 ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类,可以添加数据以及操作 FBO(ManagedFBO&…

微信公众号扫码登录

开发前准备 微信公众平台微信公众平台,给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。https://mp.weixin.qq.com/申请注册个服务号,并且需要微信认证,注意个人公众号无法开通这个功能,因为个人就不给做微信认证。…

Python | Leetcode Python题解之第350题两个数组的交集II

题目&#xff1a; 题解&#xff1a; class Solution:def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:nums1.sort()nums2.sort()length1, length2 len(nums1), len(nums2)intersection list()index1 index2 0while index1 < length1 and ind…

LLM 中 100K 上下文窗口背后的秘密

最近有几则关于新型大型语言模型 (LLM) 的公告&#xff0c;这些模型可以使用极大的上下文窗口&#xff0c;例如65K 个标记&#xff08;MosaicML 的MPT-7B-StoryWriter-65k &#xff09;甚至100K 个标记&#xff08; Antropic 的引入 100K 上下文窗口&#xff09;。在 Palm-2技术…

C++ | Leetcode C++题解之第354题俄罗斯套娃信封问题

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxEnvelopes(vector<vector<int>>& envelopes) {if (envelopes.empty()) {return 0;}int n envelopes.size();sort(envelopes.begin(), envelopes.end(), [](const auto& e1, const aut…

一招制胜!Spring Boot、Prometheus和Grafana三剑合璧,称霸监控领域!

1. 添加Prometheus和Actuator依赖 在pom.xml中添加Spring Boot Actuator和Micrometer Prometheus依赖&#xff1a; <dependencies> <!--监控功能Actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring…