Java线程池

嘿,说到Java线程,这是我多年来在问答论坛上看到的最常见的问题之一。
今天,关于CachedThreadPool的报道经常被大家记住。

说实话,CachedThreadPool有非常鲜明的特点。
首先,一个令人印象深刻的功能,就是无限扩展。
在学习中,引用的数量可以扩展到Integer.MAX_VALUE。
这听起来是不是声音有点大?但事实上,这也是一个危险点,因为一旦工作量增大,无限制的线程增长很容易吞噬系统的资源。

那么它适合短期任务。
因为线程如果停止超过6 0秒就会被销毁,所以对于执行时间较短的任务使用CachedThreadPool是相当方便的。

有趣的线程没有核心。
corePoolSize设置为0,这意味着它没有固定数量的核心线程,所有线程都是根据任务需求动态创建的。
这也让它更像是一种按需服务,有点像麦当劳的快餐模式,快来制作一份吧。

我们来谈谈工作原理。
当提出一个新项目时,它会首先检查是否有可以立即执行的线程。
如果小于,并且正在运行的线程数尚未达到最大限制,则会创建一个新线程。
线程完成任务后,会在6 0秒内空闲。
如果在这 6 0 秒内没有收到新任务,则该任务将被删除。
任务主要用于处理时间较短的任务。
例如,如果您有一个需要快速业务处理的工作流程,那么 CachedThreadPool 就适合。

说说名字的由来。
之所以称为缓冲,是因为线程池中的线程在没有任务执行时会处于空闲状态,但不会立即销毁,而是会进行缓冲。
当新作业到达时,首先检查线程是否可用。
如果是,请使用它们。
如果没有,请创建新的。

SpringBoot中还有一个相当常见的CachedThreadPool来处理异步任务。
通过配置,您可以平滑地控制线程的数量和行为。

队列的重要性确实至关重要。
对于CachedThreadPool,它使用SynchronousQueue。
该队列没有存储空间,因此“满”的概念不适用于它。

三种队列类型直接提交,如SynchronousQueue,任务直接提交到线程,不保留。
固定队列,例如LinkedBlockingQueue,当所有corePoolSize线程都忙时,会等待队列中的新任务。
有界队列(例如 ArrayBlockingQueue)有助于在使用有限的 MaximumPoolSizes 时防止资源耗尽。

总的来说,CachedThreadPool是一种灵活高效的实现,特别适合处理大量短期任务。
但在使用时也必须注意业务处理速度和提交速度之间的平衡,这样资源才不会失败。
在这种情况下,我记得大约 1 0 个日期,但我提醒你这一点。

java中有哪几种线程池

Last week my friend while studying Java thread pools found different thread pool modes. The first is newCachedThreadPool(1 ), a cache pool.这有点像仓库。
如果仓库中有线程,则复用它们。
如果没有,请创建一个新的。
This type of pool is generally used to perform some asynchronous tasks that have a short life cycle. However, the thread idles within 6 0 seconds, so it is not suitable for daemon-type servers that require continuous connections.
然后是一个newFixedThreadPool(1 ),它充当缓存池。
它还优先考虑重用线程,但不创建新线程。
However, it has the characteristic that there can only be a fixed number of active threads at most. If more threads are needed, you can just wait online.由于没有IDLE模式,因此更适合稳定且优化的并发服务器。

ScheduledThreadPool 是另一个线程池。
它就像一个计划的作业,可以延迟或定期运行作业。

最后,还有 SingleThreadExecutor。
该池中的线程是单例的。
任何时候池中只能有一个线程。
它也使用与前两者相同的池,但线程数为1 ,IDLE时间也为0秒,即没有IDLE。

我想到的另一件事是这些线程池的实现场景、优缺点。
不过具体的例子和数字我不太清楚。
你知道吗。
你需要我解释更多吗?

Java 线程池中的线程复用是如何实现的?

Java线程池核心机制总结: 1 、Worker类封装了线程和任务,最初绑定了第一个Task和Thread本身。
2 . 线程启动后,运行operator方法并调用runner循环来获取作业执行。
3 、通过getTask方法获取任务。
第一个任务直接执行,后续任务从队列中阻塞。
4 . 重用避免了频繁的创建和销毁序列,将服务与线程和动态匹配解耦。
5 、配置核心线程数量,当队列满时,回收松散的线程,并管理线程生命周期。
6 .减少线程开销,控制线程数量和任务缓冲队列,适合高并发场景。