如何在Java中创建一个自定义的线程池?

核心线程池是用ThreadPoolExecutor完成的。

直接使用新的ThreadPoolExecutor就可以了。

参数如下:核心线程数、最大线程数、空闲超时、队列、线程工厂、拒绝策略。

队列只需选择LinkedBlockingQueue,很简单。

不要使用默认的拒绝策略,它会爆炸。

使用 shutdown 并等待 Termination 来终止线程池。

你自己看看。

线程池使用及优势

说到线程池,我已经踩过沟了。
我记得我正在处理公司的一个大型项目,我需要管理大量同时发生的请求。
当时不懂线程池,就傻乎乎的给每个任务开一个线程,服务器立马就崩溃了。
那是2 01 5 年,我们公司的服务器在北京,整个部门都处于一片恐慌之中。

后来向技术部门的专家请教才知道了线程池。
她就像一个勤劳的管家,负责管理一群工人(线程)。
你把任务(工作)分配给他,他就会合理地分配给工人,保证他们不会因为任务太多而疲惫不堪,也不会因为任务太少而闲着。

那一刻我惊呆了。
原来线程池还可以控制最大并发数、管理线程、复用线程。
这简直太神奇了。
就像在工厂里一样,工人(线程)的数量是根据订单(任务)决定的,不能多也不能少。

接下来我使用了Java的Executor框架来创建线程池,发现Executors类是个好东西。
它提供了几种工厂方法,可以直接创建不同类型的线程池。
我还研究了ThreadPoolExecutor的构造方法。
七个参数确实很复杂,但是几个关键的我还记得:主线程数、最大线程数、生存时间等等。

然后我学会了管理拒绝策略,因为有时候任务太多,线程池会被压垮。
我选择了CallerRunsPolicy策略,它允许调用者自己处理任务,这样任务就不会被直接拒绝,而是有机会运行。

现在回想起来,那是一个陷阱,但也是一个成长的机会。
如果以后遇到类似的问题,我一定能够轻松应对。
呵呵,我告诉你这些只是为了让你少走弯路。

一文读懂线程池的工作原理(故事白话文)

好吧,你的问题已经很完整了。
让我们一一拆解吧。

1 .什么是主题组?
说白了,线程池就是一个管理线程的组。
我们以前没有这个。
每当我们要干活的时候,我们就找临时的人,拍拍屁股,干完活就走。
一直这样做是没有效果的,而且需要付出很大的努力。
接下来发生了什么?已经成立了常设团队。
这群人致力于这项工作。
完成工作后,他们就呆在那里等待下一份工作。
这样,需要的人员更少,工作速度更快。

2 核心主题是什么?
核心主题是拥有正式合同的员工群体。
企业往往不会轻易放弃这群人。
当你有工作的时候,先交给他们。
当他们无事可做时,他们必须保留它,而且他们不能真正切断它。

3 阻塞队列有什么用?
就像一个小仓库。
老板突然提供了一些工作,所有核心员工都接受了。
如果我们还有工作,我们该怎么办?暂时找不到别人。
就先放到这个仓库里,等核心人员干完之后再从仓库里拿出来继续干活就可以了。

4 什么是非核心主题?
这群人有点像临时工。
仓库已满,核心员工不堪重负。
我们应该做什么?找一些临时工帮忙。
一旦工作完成,仓库空了,他们就必须离开,不能再占据这个空间。

5 闲置生存时间有何重要性?
我只是一个无事可做的临时工,不可能永远吃白饭。
必须有一个时间限制。
例如,如果超过 1 5 天没有工作,则必须离开。
这会节省一些钱。

6 什么是饱和策略?
这非常重要。
当仓库满了,临时工都疲惫不堪的时候,还有人给你找工作怎么办?你不能只是说“我没空”,对吗?那么就必须使用饱和策略。
方式有很多种:一是直接咒骂别人,说“不是我做的”;一是直接扔掉作品;一是先把最早的作品扔掉,接手这个;第二,让自己做事,自己做。

7 主题池如何工作?
首先检查任务是否为空。
如果为空,则会报错。
然后看看目前在职的人数对于核心团队来说是否足够。
如果这还不够,请添加新人。
如果够了,就入库。
如果放不下,可以尝试做临时工。
如果无法添加临时工怎么办?然后咒骂或扔掉工作。

源代码怎么了?
你那一段写得非常仔细。
首先检查任务是否为空。
然后看看现在人够不够。
如果还不够,就增加更多的人。
如果够了,就入库。
如果放不下,就会被聘为临时工。
如果你不能增加更多的临时工,你就只能对他们大喊大叫或者放弃这份工作。

无论如何,仅此而已。