4. 线程池使用

 我来答
舒适还明净的海鸥i
2022-06-11 · TA获得超过1.7万个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:67.4万
展开全部

线程池: 如果线程的数量很多,并且每个线程都是执行一个时间很短的任务就结束,这样频繁创建线程会大大增加系统的开销,因为创建和消毁线程都需要资源和时间的

简单实例:

分析:

以上就是直接new一个线程池出来运行,但是阿里开发手册禁止使用该方法来启动一个线程池.而推荐使用ThreadPoolExecutor来创建

先看ThreadPoolExecutor源码

构造器提供了的参数我们来分析一下

阿里推荐我们使用ThreadPoolExecutor来创建线程池,原因是这样创建线程比较灵活,可以根据自己的业务去定制线程池

ThreadPoolExecutor源码这里就先不讲解放到下篇文章讲解,这里说说ThreadPoolExecutor的执行过程,如何触发maximumPoolSize的执行线程启动
上例子:

以上的执行结果我拷贝一定出来分析:

看到执行结果的朋友们都惊呆了,为什么这执行顺序1,2,3执行的一下子跳到54个任务,然后处理完62的任务又执行4以下的任务,接下来的顺序就正常了

原因: 定义线程池是核心为3个线程,所以执行了1-3任务,没问题!到后面线程pool-4-thread-(4-12)都是 maximumPoolSize - 核心线程 = 要创建的临时线程数.这里是 重点 ,这些临时线程是当你工作队列满了的情况才创建出来的, 而工作队列里面的任务是不先处理,而且让工作队列存放不下的任务,直接交给临时线程处理,所以临时线程直接执行了54-62任务,然后处理完之后在去队列里面从头获取任务执行,所以执行完62任务后后面的执行顺序就正常了.运行到了下面,直接任务数到了29381082时,这里我是启动了任务执行处理不来是或工作队列满了时,任务丢弃了,所以存到工作队列任务的数字就是29381082,然后就通过线程去获取任务指定任务

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式