必会的JVM线程池基础知识 - 极悦
首页 课程 师资 教程 报名

必会的JVM线程池基础知识

  • 2020-10-27 17:47:15
  • 1454次 极悦

想要一个程序能快速高效的运行,对CPU的合理使用是关键。因为运行程序在本质上是系统资源的使用,JVM线程池就是一种利用CPU的优化方式,如何高效的使用这些资源是我们编程优化演进的一个方向。下面我们来讲一讲关于JVM线程池基础知识。

image.png

提交一个任务到线程池中,JVM线程池的处理流程如下:

1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。

2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。

3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。


在线程池中,有如下五个参数是需要知道的:

1、corePoolSize(线程池基本大小):当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize时,(除了利用提交新任务来创建和启动线程(按需构造),也可以通过 prestartCoreThread() 或 prestartAllCoreThreads() 方法来提前启动线程池中的基本线程。)

2、maximumPoolSize(线程池最大大小):线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。另外,对于无界队列,可忽略该参数。

3、keepAliveTime(线程存活保持时间)当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数。

4、workQueue(任务队列):用于传输和保存等待执行任务的阻塞队列。

5、threadFactory(线程工厂):用于创建新线程。threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号)。

image.png

JVM线程池的简单使用,以下代码,是在Java中创建线程池:

import java.util.concurrent.*;

public class App {

    public static void main(String[] args) throws Exception {

        ExecutorService executorService = new ThreadPoolExecutor(1, 1,

                60L, TimeUnit.SECONDS,

                new ArrayBlockingQueue<>(10));

        executorService.execute(new Runnable() {

            @Override

            public void run() {

                System.out.println("abcdefg");

            }

        });

        executorService.shutdown();

    }


Jdk提供给外部的接口也很简单,直接调用ThreadPoolExecutor构造一个就可以了,也可以通过Executors静态工厂构建,可以看到,开发者想要在代码中使用线程池还是比较简单的。


今天学习的关于JVM线程池必会基础知识就是上面的内容了,希望可以对java零基础的朋友们学习线程池有所帮助。对于线程池,除了知道原理和一些参数外,大家可以在java教程中学习怎样布置线程池,因为更重要的是要会在代码中合理使用线程池,从而高效的运行程序。


选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交