线程池FixedThreadPool

如何创建 FixedThreadPool

直接 new的话,好像是出不来的
线程池FixedThreadPool_第1张图片
只能通过自动创建来创建一个出来

public class TestFixedThreadPool{

    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
    }
}

参数传进去 5代表了什么意思?我们进去源码看一下

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
  • 第一个参数位置,代表了 corePoolSize,在这也就是核心线程数为 5
  • 第二个参数位置,代表了 maximumPoolSize,在这也就是最大线程数为 5
  • 第三个参数位置,代表了 KeepAliveTime,在这代表了空闲线程存在的时候为0
  • 第四个位置,代表了 unit,也就是毫秒级别的时间,跟 KeepAliveTime对应
  • 第五个位置,代表了 workQueue,也就是阻塞队列,在这里的阻塞队列是没有限制存放任务的个数,从源码看,理论能到达 Integer.MAX_VALUE
 public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }

从上面的 corePoolSize 和 maximumPoolSize可以知道,这是一个固定线程数的线程池,也就是线程池会从零开始创建线程直到到达 corePoolSize的个数,之后就算线程池空闲也不会销毁线程,因为不需要销毁线程,所以后面的 KeepAliveTime 设置为 0L

测试运行下 FixedThreadPool

public class TestFixedThreadPool {

    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "运行了!!");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        for (int i = 0; i < 50; ++i) {
            threadPool.submit(thread);
        }

        threadPool.shutdown();
    }
}

线程池FixedThreadPool_第2张图片
创建了一个 corePoolSize为5的线程池,并创建一个线程,run() 方法中实现打印线程的名字还有睡眠500毫秒再运行,下面用了个 for循环提交了50次的任务,最后调用 threadPool.shutdown()关闭了线程池

对于上面打印的内容可以知道,线程池只维持了5个线程,线程执行完任务后,再去取新的任务执行,一直循环

有个问题要给大家知道,如果不关闭线程池行不行?

线程池FixedThreadPool_第3张图片
可以不关闭,但是在测试中,不关闭的话,它执行完所有任务后,就一直会存在在哪里,在真实项目中,是否要关闭,说真的,我是个小白,并不知道

还有就是为啥不调用查看核心线程数,最大线程数,线程存活的时间等等方法?这个是因为,我调用线程池的方法中,并没有存在类似等方法,可能因为这是自动创建的,如果你是用的 ThreadPoolExecutor创建线程池的话,就有方法可以查看
在这里插入图片描述


欢迎大家关注下个人的「公众号」:独醉贪欢

你可能感兴趣的:(Java并发编程)