本帖最后由 a12939026 于 2013-01-23 15:13:42 编辑

解决方案 »

  1.   

    刚看了下,执行时这样public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue)在这构造方法中,优先级处理任务的优先级为: 
    核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize。意思是只有当corePoolSize中任务满了,会先放到workQueue缓冲队列中,缓冲队列满了,才会放到maximumPoolSize里面去。
    楼主可以把   BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20);里面的20改成6或7看下效果。 
      

  2.   

    ls所言极是。
    要等到queue满了才会增加线程的,否则是不会超过coreSize个的
      

  3.   

    不一定,看线程数吧,如果同一时间用到的线程比较多,那你线程池中最大数,可以调的大一些;而且corePoolSize 也可以适当调大一些.
    但不是说你的线程多,就可以无限上调最大线程数.当需要的线程数大于最大值时,也存在等待分配线程的资源,这种情况也是常有的,看具体要求了.
    对于你的这个情况,倒是可以调大一些.
      

  4.   


    改了7 就是4个执行, 6 就是5个线程, 5 就报错了。
    意思是这样? 先找核心线程 不够放就放进workQueue,还不够久加大直到最大线程? 再不够就报错了。。
    我想问下, 怎么弄才能在超过最大线程之后 不报错 而是放入另外一个等待队列中呢?
      

  5.   

    改了7 就是4个执行, 6 就是5个线程, 5 就报错了。
    意思是这样? 先找核心线程 不够放就放进workQueue,还不够久加大直到最大线程? 再不够就报错了。。
    我想问下, 怎么弄才能在超过最大线程之后 不报错 而是放入另外一个等待队列中呢? 
    上一楼引用错了。 
      

  6.   

    看这个构造方法的这个参数:
    ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) 当超过了又没线程执行,可以自己选择策略