线程池参数如何理解?大白话餐厅举例!

首先我们先来看下概念:

核心线程数(Core Pool Size): 线程池中能保持活动。。。

最大线程数(Maximum Pool Size): 线程池中允许存在的。。。

任务队列(Work Queue): 用来保存等待执行的任务的队列。当线程池。。。

线程存活时间(Keep Alive Time): 只有在线程池的线程数超过核心线程数。。。

确实有点麻烦去理解,那我来翻译一下:

我现在开了一家海底捞火锅店,假设每桌客人都点了拉面

核心线程数:拉面师傅

最大线程数:餐厅的座位

任务队列:美甲小姐姐

线程存活时间:临时雇来的拉面师傅工作时间

餐厅开始接待客人。。

客人如潮水般涌来,开始进店的客人安排上拉面师傅拉拉面。

拉面师傅都在忙,其他客人全都去做美甲,暂时稳住客人。

美甲小姐姐都在忙,赶紧去找临时拉面师傅,临时拉面师傅开始拉拉面。

所有座位全部坐满,拉面师傅照顾一批,美甲小姐姐照顾一批,临时拉面师傅照顾一批。

再有新客人进来就拒绝了。

拒绝客人后会有以下四种反应:

1.投诉海底捞总部,上级来处理这个问题。

2.受了一肚子气,憋在肚子里自己受。

3.不吃了。

4.找到里面美甲小姐姐照顾的客人,把它赶出去,自己坐下。

大家可以对比一下,原文是这样的

核心线程数(Core Pool Size): 线程池中能保持活动的最小线程数。即使线程处于空闲状态,核心线程也会一直存活,除非设置了适当的超时策略。

最大线程数(Maximum Pool Size): 线程池中允许存在的最大线程数。当任务队列满了且活动线程数达到核心线程数时,线程池会创建新的线程,直到达到最大线程数。超过最大线程数的任务将会根据拒绝策略进行处理。

任务队列(Work Queue): 用来保存等待执行的任务的队列。当线程池中的线程数达到核心线程数时,新任务会被放入任务队列中。如果任务队列已满,且线程数未达到最大线程数,则会创建新的线程来执行任务。

线程存活时间(Keep Alive Time): 只有在线程池的线程数超过核心线程数时,多出来的空闲线程才会根据这个参数来决定回收。

这些参数之间的关系如下:

当有新任务需要执行时,线程池会优先尝试使用核心线程来处理任务。

如果任务队列已满,且线程数未达到最大线程数,则会创建新的线程来处理任务。

当线程池中的线程数超过核心线程数,并且任务队列已满时,新任务会根据拒绝策略进行处理。

拒绝策略(Rejected Execution Handler)定义了当线程池无法执行新任务时采取的处理方式。常见的拒绝策略包括:

  • AbortPolicy(默认): 抛出 RejectedExecutionException 异常,阻止系统正常工作。
  • CallerRunsPolicy: 将任务返回给调用者,由调用者所在线程执行。
  • DiscardPolicy: 直接丢弃任务,不提供任何反馈。
  • DiscardOldestPolicy: 丢弃队列中等待时间最长的任务,然后尝试再次提交当前任务。
值传递和引用传递可以用生活中的例子来通俗理解。 值传递就好比你要和朋友分享一本书的内容,你不是把书直接给朋友,而是把书里的内容抄写到一张纸上给朋友。朋友看到的是你抄给他的内容,即使朋友在这张纸上做了什么修改,比如画了个标记,原来的那本书也不会有任何改变。在编程里,基本数据类型的传递就是值传递,像整数、字符等,传递的是实际的值,接收方对这个值做修改不会影响原来的值。比如你有一个变量`int a = 10`,把`a`的值传递给另一个变量`b`,之后`b`的值改变,`a`的值不会变。 引用传递就像是你和朋友分享一本书,你直接把这本书的地址(比如书放在图书馆的哪个书架的哪个位置)告诉朋友,朋友根据这个地址就能找到这本书。朋友对这本书做的任何改变,比如撕掉一页,下次你再去看这本书时,它就是被朋友改动后的样子了。在编程里,引用数据类型的传递就是引用传递,像对象等,传递的是对象的引用(可以理解为对象的地址),接收方对这个引用指向的对象做修改,原来的对象也会改变。例如上述引用中的代码,`Order o1 = new Order();`创建了一个`Order`对象,`Order o2 = o1;`把`o1`的引用传递给`o2`,`o1`和`o2`指向堆空间中同一个对象实体,修改`o2`的属性,`o1`对应的属性也会改变[^1]。 ```java // 值传递示例 public class ValuePassingExample { public static void main(String[] args) { int a = 10; changeValue(a); System.out.println("a 的值: " + a); } public static void changeValue(int num) { num = 20; } } // 引用传递示例 class Order { int orderId; } public class ReferencePassingExample { public static void main(String[] args) { Order o1 = new Order(); o1.orderId = 1001; changeOrder(o1); System.out.println("o1.orderId: " + o1.orderId); } public static void changeOrder(Order order) { order.orderId = 2001; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值