放翁(文初)的一亩三分地

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  210 随笔 :: 1 文章 :: 320 评论 :: 0 Trackbacks
        现在很多系统中,特别是事件驱动的系统中,对于线程池的维护很多时候根据业务处理类型的不同做划分和管理,但分开维护会带来下面两个问题: 

1. 到处线程池,每个线程池都有上限设置,但是所有线程池到达上限的时候也许系统已经无法承受了,所以局部设计和限制无法达到全局限制的目标。

2. 合理的利用线程池的资源,当线程池逻辑上真实隔离后,就无法将空闲的线程资源借调给繁忙的任务处理使用。

设计中关注的:

  虚拟隔离线程池需要有模型可以保证对于一些处理的保护,对于一些处理的降级。

设计思路:

  简单的两种配置模式:保留,限制。

举个例子:

  默认线程池大小设置为100

    A类任务设置为保留10B类任务设置为限制50

  假设有A,B,C三种任务进入。

    A最大可以使用100个线程,其中10个是它独占的(通过配置可以选择优先使用公有的还是私有的)

    B最大可以使用50个线程,当公有线程(100-10=90)被消耗后剩余总数小于50,那么B消耗的数量就会小于50,假如公有90个线程都没有被消耗,此时B最多也只能消耗50个线程。总结来说,B消耗公有的线程资源,同时最多只能消耗他的设置(当然他设置如果超过公有线程,则以公有线程池最大作为上限)

    C最大可以使用90个线程,也就是所有的公有线程。

当任何一种请求没有线程资源可以被使用的时候,将会被放入队列,等待线程可用,队列不区分任务类型。

    第一版简单的Java代码参看:http://www.rayfile.com/zh-cn/files/66a89e61-4357-11e0-9ad5-0015c55db73d/
        这里只是探讨一种简单的设计思路,以最小代价来全局化管理维护线程池或者资源池。

posted on 2011-03-01 00:32 岑文初 阅读(5150) 评论(4)  编辑  收藏

评论

# re: 逻辑划分线程池 2011-03-01 11:57 Any
建议代码放到github上, 方便参与进来!  回复  更多评论
  

# re: 逻辑划分线程池 2011-03-01 12:25 岑文初
@Any
http://code.google.com/p/sharedthreadpool/  回复  更多评论
  

# re: 逻辑划分线程池 2011-03-05 17:40 风景画
这里只是探讨一种简单的设计思路很强大,方便参与进来!  回复  更多评论
  

# re: 逻辑划分线程池 2012-05-25 18:23 thegodofwar9
仔细看了一下你的实现代码,思路很好,但是JobDispatcher的submitJob方法、beforeExecuteJob方法、releaseJob方法在多个线程里并发运行情况下,这些方法里面的多个原子性操作合在一起并不是原子操作,也就是多个线程同时可以访问修改JobDispatcher里面的资源,加锁必然会带来很大的性能损失,不知道你这样不加锁会不会导致有些特殊情况出错?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: