线程池之newFixedThreadPool定长线程池的实例

这篇文章主要介绍了线程池之newFixedThreadPool定长线程池的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

newFixedThreadPool定长线程池的实例

newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newFixedThreadPool固定线程池, 使用完毕必须手动关闭线程池, 否则会一直在内存中存在。

示例代码:

 public class ThreadPoolFixed { public static void main(String[] args) { //设置线程池大小为3 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i <10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { @Override public void run() { try { System.out.println(index+"当前线程"+Thread.currentThread().getName()); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } fixedThreadPool.shutdown(); } }

运行结果:

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。

corePoolSize:

线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。

这里需要注意的是:在刚刚创建ThreadPoolExecutor的时候,线程并不会立即启动,而是要等到有任务提交时才会启动,除非调用了prestartCoreThread/prestartAllCoreThreads事先启动核心线程。

再考虑到keepAliveTime和allowCoreThreadTimeOut超时参数的影响,所以没有任务需要执行的时候,线程池的大小不一定是corePoolSize。

maximumPoolSize:

线程池中允许的最大线程数,线程池中的当前线程数目不会超过该值。

如果队列中任务已满,并且当前线程个数小于maximumPoolSize,那么会创建新的线程来执行任务。

这里值得一提的是largestPoolSize,该变量记录了线程池在整个生命周期中曾经出现的最大线程个数。

为什么说是曾经呢?因为线程池创建之后,可以调用setMaximumPoolSize()改变运行的最大线程的数目。

poolSize:

线程池中当前线程的数量,当该值为0的时候,意味着没有任何线程,线程池会终止;同一时刻,poolSize不会超过maximumPoolSize。

定长线程池简易原理图及实现思路

队列中存放着实现了runnable接口的对象。每次有新任务的时候,就会往队列中push进一个对象。线程1-4需要定义为继承了Tread类的内部,在类中的run方法中,定一个while循环,不断的轮询送队列中取对象,执行对象中的run方法。

线程中需要存放着线程池的对象的指针,便于获取到线程池对象的队列。

当然,这个线程是是定长的。有些情况下,定长的数量不够,或者高峰期过后,长度需要降下来。这时候,就需要变长的线程池了。后续继续更新支持动态扩展的线程池的实现思路。

以上就是线程池之newFixedThreadPool定长线程池的实例的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java