`
ChristmasLin
  • 浏览: 41998 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

逻辑划分线程池-任务池

阅读更多

服务端编程里,线程池的使用非常普遍。往往是按照逻辑划分为不同的线程池。这种做法存在一个问题,对每个线程池的利用都是局部的,缺少一个全局限制的目标。

 

希望能有一种任务池的机制,多个任务池共享一个线程池,每个任务池可配置并发执行的能力,主要有两个参数,固定为该任务池服务的线程数和峰值时可弹性增加的线程数。

 

在网上发现类似的两篇文章,放翁(文初)的《逻辑划分线程池》和淘宝博客上一篇《支持配额的共享线程池》。看了一下,对任务池(暂且都叫任务池)的看法都差不多,前者的“保留数”和后者“固定配额”都是固定分配给一个任务池的线程数。前者的“限制数”和后者的“弹性配额”是动态申请数。但是在实现,两者有一点区别(更详细的大家可把他们的代码下来研究下)。下面简单说一下两者的实现。

 

前者全局有一个任务队列,提交任务时,判断对应的任务是否能被执行,如果可以则提交到线程池,否则,提交到任务队列。有一个额外的后台提交任务的工作线程,不断从任务队列里取任务,做提交任务的操作,如果任务不能被提交到线程池,则会再放回任务队列。在某些情况下,这个提交任务的工作线程可能遍历整个队列才能找到可以被提交的任务。甚至是在空转,假如任务队列的任务都是不能被提交的。然后还有一个取出的任务为空,睡眠一小段时间,这个时间具体大小也是一个比较难确定的值。

 

        后者也有一个全局的任务队列,提交任务时,判断对应的任务是否能被执行,如果可以则提交到线程池,否则,提交到任务队列。那么,任务队列的任务什么时候再提交到线程池,作者没有使用额外的线程,当提交到线程池的一个任务执行结束后,加了一个顺带从任务队列取任务提交到线程池的操作。注意,在这里,这个提交操作没有再判断该任务是否超过它的配额。作者这里把它简单化了,任务队列是一个优先级的队列,固定配额较大的任务的优先级较高。这种处理方法可能也会导致一种任务的并行执行数超过它的实际配额。

 

看了两者的实现,和自己的需求还是有点距离,前者的后台工作线程在某些情况可能效率比较低,后者的对于任务的限制也存在一些缺陷。两者有一个共同点是通过判断,再把任务提交到线程池,提交到线程池的任务就是可执行的。对于任务池的需求,这种处理方法不太好实现或是实现的不完全。那么能否换个思路,不把任务直接提交到线程池,,只提交取任务的操作到线程池。

 

个人思路:

1. 共享线程池,逻辑划分为任务池,每个任务池配置固定配额和弹性配额。

2. 每个任务池有自己的任务队列,提交到任务池的任务先提交到对应的任务队列。

3. 创建任务池时,如果有固定配额,提交固定配额任务到线程池,固定配额任务不会释放线程,它的操作是不断 从任务队列取任务执行。

4. 提交任务时,判断如果需要执行申请弹性配额,提交弹性配额任务到线程池。弹性配额任务尝试从任务队列取 任务,如果为空则释放线程。

 

这样处理能比较好的实现任务池的需求。多任务队列带来一个额外的好处是,减少对线程池的任务队列的争用。把多个线程池合并成一个任务池,执行任务的线程数也多了,如果底层仍然用一个任务队列,对这个任务队列操作是一个热点。使用多任务队列,不是所有的任务最终都提交到线程池的任务队列,只有需要弹性配额时才提交。

 

郁闷,google-code的密码页面打不来。第一版的实现见附件。

分享到:
评论

相关推荐

    java面试题目

    - 使用连接池技术,预先建立并维护一定数量的空闲连接。 - 限制最大并发连接数,超出上限的连接请求排队等候处理。 - 引入负载均衡器,分散请求到多个服务器节点。 - 实现请求限流机制,根据服务器当前状态动态...

    java最新面试宝典

    - 线程池的创建与管理。 - **面试考察要点:** - 死锁的概念与预防措施。 - 线程安全问题的识别与解决。 #### 二、Java虚拟机 **2.1 JVM内存区域划分** - **知识点概述:** - 程序计数器的作用。 - 虚拟机栈的...

    大数据各类性能调优

    - **多并发JDBC客户端连接JDBC Server**: 优化连接池配置。 - **Parquet元数据buildScan优化**: 使用Filter Pushdown等。 - **ParquetRelationInputSplits优化**: 调整Split大小。 - **Limit优化**: 减少不必要...

    多核程序设计技术-通过软件多线程提升性能(中文版)

    - **线程池**:线程池是一种管理线程的机制,它可以预先创建一定数量的线程,并将这些线程放入一个池中等待分配任务。这样可以减少线程创建和销毁的开销,提高系统的响应速度和吞吐量。 - **异步编程模型**:异步...

    stormzhang收藏——Android找工作面试宝典

    - **Activity生命周期**:理解每个状态及其转换,如何在不同状态之间处理逻辑。 - **Intent机制**:理解Intent的作用,如何创建、发送和接收Intent。 - **Service**:了解Service的启动方式,生命周期,以及与...

    java面试宝典

    - **使用:** 提交任务给线程池执行。 **56. 线程安全的集合类?** - **线程安全集合:** Vector、HashTable、ConcurrentHashMap等。 - **非线程安全集合:** ArrayList、HashMap等。 **57. Collection的常用子接口...

    最新JAVA华为面试题

    - 项目模块通常是按功能或组件划分的,例如业务逻辑模块、数据访问模块、用户界面模块等。 14. **关联与依赖**: - 在面向对象设计中,关联和依赖都是类与类之间的关系。关联表示类之间的结构关系,依赖则表示类...

    java-fork-join:Java fork中的八个基准测试

    在“java-fork-join-master”这个项目的源代码中,可能包含了实现这些基准测试的详细代码,包括任务分解逻辑、性能监控和结果分析。通过阅读和分析这些代码,我们可以深入了解Fork/Join框架的工作原理和性能特性,为...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.3.docx

    除此之外,面试还可能涉及其他的Java后端知识点,如异常处理、集合框架、IO流、设计模式(如工厂模式、单例模式、观察者模式等)、数据库连接池、SQL优化、NoSQL数据库、RESTful API设计、分布式系统概念等。...

    Sybase ASE 15.7 开发文档:系统管理指南(卷二)

    将数据高速缓存划分为若干内存池 .......... 83 匹配日志高速缓存的日志 I/O 大小 .......... 85 将对象绑定到高速缓存 .......... 86 高速缓存绑定限制 .......... 87 获得有关高速缓存绑定的信息 .......... 87 ...

    Java范例开发大全 (源程序)

     实例7 逻辑运算符 14  实例8 位运算符 15  实例9 移位运算符 16  实例10 转型运算符 17  2.3 其他形式 18  实例11 常量与变量 18  实例12 各种进制的转换 19  实例13 Java中的进制与移位运算符 22 ...

    java范例开发大全(pdf&源码)

    实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 滚动的...

    java范例开发大全源代码

     实例7 逻辑运算符 14  实例8 位运算符 15  实例9 移位运算符 16  实例10 转型运算符 17  2.3 其他形式 18  实例11 常量与变量 18  实例12 各种进制的转换 19  实例13 Java中的进制与移位...

    java范例开发大全

    实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 滚动的...

    Java范例开发大全(全书源程序)

    实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 ...

Global site tag (gtag.js) - Google Analytics