线程池之newFixedThreadPool定长线程池的示例分析
更新:HHH   时间:2023-1-7


这篇文章将为大家详细讲解有关线程池之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定长线程池的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

返回开发技术教程...