Java线程池ThreadPoolExecutor小结

来源:互联网 发布:文本压缩算法 编辑:程序博客网 时间:2024/05/17 12:24


几点需要注意的部分:

(1)当线程池数量小于corePoolSize大小,线程池创建一个新的线程来运行新的任务,即使之前创建的线程处于空闲状态。

prestartAllCoreThreads():在创建线程池时候设置。表示在线程池创建但还没有接受到任何任务的情况下,先行创建大小为corePoolSize的线程数。

举个例子:

 ThreadPoolExecutor poolExecutor =new ThreadPoolExecutor(5,10,1, TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(1)); poolExecutor.prestartAllCoreThreads();

(2)当线程池中存在大于corePoolSize数目的线程,如果当某个线程处理完任务后,等待keepAliveTime时间后仍然没有新的任务分配给它,那么这个线程将被回收。回收线程时,所有线程一视同仁,直到线程池中数量等于corePoolSize时停止回收。

allowCoreThreadTimeOut:将包括核心线程在内的,没有任务分配的任何线程,在等待keepAliveTime时间后全部进行回收。

特例:如果设置的corePoolSize参数和设置的maximumPoolSize参数一致时,线程池在任何情况下都不会回收空闲线程。keepAliveTime和timeUnit也就失去了意义。)

(3)ThreadPoolExecutor线程池中三种实现BlockingQueue接口的任务等待队列:

SynchronousQueue:有限队列,这是一个内部没有任何容量的阻塞队列,任何一次插入操作的元素都要等待相对的删除/读取操作,否则进行插入操作的线程就要一直等待。即每个put必须等待一个take。

ArrayBlockingQueue:有限队列,一个由数组支持的有界阻塞队列。先进先出,有界缓冲区。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。

LinkedBlockingQueue:无限队列,某种意义上也是有限队列(max为Integer.MAX_VALUE)。基于链表实现,可以指定容量(等同于ArrayBlockingQueue),也可以不指定。


参考博客:ThreadPoolExecutor机制

原创粉丝点击