提起线程池我们会想到两件事:
1.线程池是为了复用线程避免重复开辟线程带来开销.
2.我们用多线程是为了提升执行效率,但是多线程会带来数据同步问题.加锁会降低性能,线程上下文切换也会降低性能.
我在想一个问题:能不能避免加锁和避免上下文切换带来的性能开销?如果能避免这个开销,多线程最后一个被诟病的问题岂不是解决了?
在此之前,我想说这个解决办法并不是用多个线程池组去管理你的业务.例如你可能会用登录线程池去处理登录逻辑,注册线程池去处理注册逻辑.用这种方法达到业务隔离,
但是本文并不是在这个层面上去做的事情,而是细分到单个线程池如何去管理这个线程池的线程分配的问题.
假设你的线程池的线程数量为4,那么你会有A B C D 4个线程,需要去执行1万个任务.按照目前普通的线程池做法其实就是随机在A B C D上分配任务并且去执行.正是这种随机性导致并发问题和上下文切换的开销.
假设每次执行任务恰好都是随机的那么会有 A B C D 4个线程4倍开销,现在假设任务能分配到根据分组,某一组的任务能集中分配到A B C D的某一个线程上,那么就会把这个开销降低4倍.
如果线程池有100个线程那么会降低100倍,因为之前每个任务都随机分配在不同线程就会有不同线程去竞争这些任务带来开销,线程经过排队避免了这种开销.
有什么应用场景?
就算是针对某单个线程池,假设线程数量为4个,其实我们执行的任务大部分并不是没有规律的,可以根据用户/房间号进行分组.
例如你在做某个棋牌游戏,假设有1万个房间,每个房间都会有一个定时器去做回调处理.通常我们会用一个线程池去处理这一万个房间里面的计时任务.但是因为是线程池执行任务是根据队列顺序的也是随机的所以会带来开销.
那么我们可以根据房间号去分组,这样能让同一个房间号能分配在某个线程去执行,
即用到了多线程的好处:4个线程处理了1万个任务,又避免了线程的一些开销.不需要加锁,没有竞争没有上下文切换.
***********************************************************
由于工作繁忙还没完全实现并测试性能提升多少的问题.
做法是
1:每个任务多一个分组属性.
public class GroupRunable implements Runnable {
private Object group;
2:改造ThreadPoolExecutor的BlockingQueue<Runnable> workQueue 变成一个Map每个Group 一个Queue
改造getTask()方法,如果某个Task在某个Thread上执行了,就把后面的这个Group的Task都分配到这个Thread去执行.
待续........
相关推荐
如果需要更复杂的配置,如定制线程工厂、拒绝策略等,可以使用`ThreadPoolExecutor`直接创建线程池,如下: ```java int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 5000L; TimeUnit ...
Tomcat的线程池实现是基于Apache Commons JMX的ExecutorService,它是对Java标准库ExecutorService的一种扩展,增加了更多的监控和管理功能。 Tomcat的线程池主要由`org.apache.tomcat.util.threads.TaskQueue`和`...
线程池的主要优点在于可以显著减少线程创建和销毁的开销,并且能够更好地控制并发线程的数量,从而避免因线程过多而引起的资源过度消耗。 #### 四、线程池的关键组件 线程池的设计涉及到多个关键组件,下面详细...
在实际应用中,为了更好地管理和控制线程池,你可能还需要添加一些额外的功能,例如限制同时运行的任务数量、设置线程优先级、处理异常等。此外,考虑到VC6是一个较旧的开发环境,你可能需要查阅更老版本的Windows ...
【Linux 线程】在Linux环境下,线程是轻量级进程,它们共享同一地址空间,因此相比进程创建和销毁更快。线程池在Linux下的应用能够有效地提高系统对并发请求的响应速度,尤其是对于处理大量短生命周期的任务,能够...
SmartThreadPool由Anders Laub开发,其设计目标是提供更高效、更灵活的线程池管理机制,以适应不同应用场景的需求。 在.NET Framework中,内置的System.Threading.ThreadPool虽然方便使用,但在某些特定场景下可能...
- **优化线程优先级**:适当调整 `threadPriority` 参数,可以使某些类型的任务得到更快的响应。 #### 五、总结 通过上述步骤,我们可以有效地在Tomcat 6.0中配置共享线程池,这不仅有助于提高服务器的并发处理...
在实际应用中,理解线程池的源码有助于我们更好地定制线程池,优化系统性能。例如,通过自定义拒绝策略(RejectedExecutionHandler)来处理任务提交过多的情况,或者通过监控线程池的状态(如通过`...
相比于进程,线程的创建和销毁更快,更适合处理大量并发任务。 【线程池原理】 线程池的工作流程通常包括以下几个步骤: 1. 初始化线程池:创建一定数量的线程并置于待命状态。 2. 接收任务:当有新的任务请求时,...
而通过使用线程池,可以将这些任务分配给预先创建好的线程,避免了不必要的线程创建成本,使得系统能够更快地响应用户请求。 #### 4. 实例分析 假设有一个基于Java的工作流引擎,需要处理大量的短小任务。如果对于...
- **更好的管理**:线程池可以设定最大线程数量,防止系统资源耗尽。 3. **线程池实现的关键点** - **线程池初始化**:设置线程池大小,创建线程并保存在数据结构中。 - **任务队列**:存放待处理的任务,通常...
在C++编程中,线程池是一种管理线程资源的有效方式,它可以帮助开发者更高效地调度并发任务,提高系统性能并降低系统开销。本文将深入探讨“c++ 线程池 即用版”这个主题,以及如何实现一个线程池,特别是线程数目...
#### 二、为什么使用线程池? 在某些场景下,使用线程池是非常必要的: 1. **单个任务处理时间较短**:如果任务处理时间较短,频繁创建和销毁线程会导致更多的系统开销。 2. **任务数量巨大**:当任务数量非常多时...
在Java编程中,线程池是一种管理线程的机制,它可以有效地控制运行的线程数量,避免因大量创建和销毁线程带来...通过分析和运行这个示例,我们可以更直观地了解线程池在不同场景下的表现,从而更好地在实际项目中运用。
"uThreadPool"是针对Pascal语言的一个线程池实现,可能是一个开源库或组件,用于帮助开发者更方便地管理和调度并发任务。 标题中的"uThreadPool线程池最新修正"表明这个库可能有一个更新版本,修复了之前用户在CSDN...
拒绝策略是线程池的重要特性,当线程池无法接纳更多任务时,它会按照设定的策略处理。Java的Executors框架提供了四种默认策略: - AbortPolicy(默认):抛出RejectedExecutionException异常,终止执行。 - ...
如果任务提交速率不稳定,`LinkedBlockingQueue` 可能更适合;对于需要快速响应并尽可能减少线程切换的场景,`SynchronousQueue` 会是不错的选择。 总的来说,`java.util.concurrent` 提供的线程池和工作队列机制,...
线程池是一种强大的工具,可以帮助开发者更高效地管理多线程环境中的任务调度。通过合理配置线程池,不仅可以提高程序的性能,还能有效降低资源消耗。理解和掌握线程池的基本原理及其实现机制,对于编写高质量的多...
在描述中提到的"很经典的一个线程池应用"可能指的是一个开源库,如Android的`AsyncTask`或者更先进的`OkHttp`的调度器,它们都提供了线程池管理的实现。这些框架通常会根据任务类型和系统资源智能地调整线程数量,以...