我想实现这样一个线程池控制:
核心线程数有10个,最大线程数20,任务队列无限。调度顺序为,当有10个以下任务进来时,由核心线程处理;当11个任务进来时,这时候新增一个线程,让11个线程运行;当有20个以上任务进来时,最大线程20个同时运行,剩下的任务进入任务队列。
也就是说线程调度的优先级是:核心线程>最大线程>任务队列看了一下JDK1.5提供的ThreadPoolExecutor,它的任务处理优先级是:核心线程>任务队列>最大线程。应该怎么处理才能达到我想要的效果呢?还请各位大虾多多赐教~~~~谢咯

解决方案 »

  1.   

    LZ都知道JDK5.0新加入的线程池了,你说的问题肯定能解决,自己试试吧。。或者参考网上实现的一些,给你个链接,希望能帮助你。
    http://pingfang.javaeye.com/blog/47605
      

  2.   

    晕了,你去查ThreadPoolExecutor的文档,里面有一种策略和队列完全就是为你准备的……
    JDK1.5的,中文的,就这个类,很详细的
    http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/concurrent/ThreadPoolExecutor.html
      

  3.   

    sorry,刚才没看明白你的意思
      

  4.   

    ThreadPoolExecutor realExecutor = new ThreadPoolExecutor(10, 20, 60, TimeUnit.SECONDS, queue, factory);
    这里的queue 使用LINKED的队列 这样的话 可以无边界的增长。
      

  5.   


    这样创建的线程池,任务处理的优先级是:核心线程>任务队列>最大线程。我希望是核心线程池满了后,能够优先起线程处理任务,达到最大线程后再放入任务队列。
      

  6.   

    应该没有了,这个是写死的策略。不然你只有继承自ThreadPoolExecutor,修改一下我说的办法你不需要维护线程池,只是让线程池的队列为0而已,外面再有一个自己的队列,我都自己这么做过,完全没有风险。
      

  7.   

    应该是“如果处理快, 即使10个线程, 里面也有空闲的.”吧ncro说得蛮有道理的!!对于10-20动态调整的线程池,针对不同的任务数级别,大致可以分为下面3种情况
    如果任务在10个以下,那动态调整根本不需要;
    如果任务在20个以上,就是ncro说的了。如果处理快,10个线程已经足够了;如果慢,20个也很快就撑满。
    如果任务在10-20个,只有这种情况动态调整存在一定的意义。可以保证每个进来的任务都可以立即得到处理。根据这样分析,只有当这个线程池的普遍处理任务数都在10-20一个较稳定的范围时,动态调整存在一定的意义(但如果任务数都在这个范围稳定的话,可以直接new一个长度为20的固定线程池就搞定了);如果任务数波动较大的话,就多数取决于任务处理的快慢,线程池的动态调整就没什么意义了。动态调整估计比较适用于一些非常精密、高效的程序中,普通的程序应该是涉及不到的。如果大家还有更好的想法,希望也能一起讨论一下啊。
    PS:这个帖子铁定是要再加分的!
      

  8.   

    其实我自己写的多线程蜘蛛用jprofiler监控的时候,发现线程池每个线程wait的时间要占总时间的一半以上。所以觉得不必太过于纠结这个问题。
      

  9.   

    LZ都知道JDK5.0新加入的线程池了,你说的问题肯定能解决,自己试试吧。。或者参考网上实现的一些,给你个链接,希望能帮助你。 
    http://pingfang.javaeye.com/blog/47605