ThreadPoolExecutor详解(定义作用及使用原理)

ThreadPoolExecutor详解(定义作用及使用原理)-mikechen

ThreadPoolExecutor定义

ThreadPoolExecutor是Java标准库中的一个类,用于实现线程池。

 

ThreadPoolExecutor作用

ThreadPoolExecutor作用:可以创建一个固定大小的线程池,用于管理一组线程,可以重复使用这些线程来执行多个任务,以减少线程创建和销毁的开销。

 

ThreadPoolExecutor构造函数

ThreadPoolExecutor的构造函数可以接收四个参数:核心线程数、最大线程数、空闲线程存活时间和任务队列。

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
}

Java线程池的参数说明,如下所示:

ThreadPoolExecutor详解(定义作用及使用原理)-mikechen

 

ThreadPoolExecutor使用示例

创建了一个固定大小为5的线程池,向线程池中提交了10个任务,每个任务都会在一个独立的线程中执行。

如下所示:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class ThreadPoolExecutorExample {
    public static void main(String[] args) {
        // 创建一个固定大小为5的线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 向线程池中提交10个任务
        for (int i = 0; i < 10; i++) {
            executor.execute(new Task(i));
        }

        // 关闭线程池
        executor.shutdown();
    }

    private static class Task implements Runnable {
        private int taskId;

        public Task(int taskId) {
            this.taskId = taskId;
        }

        @Override
        public void run() {
            System.out.println("Task #" + taskId + " is running on " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000); // 模拟任务执行时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Task #" + taskId + " is completed.");
        }
    }
}

 

ThreadPoolExecutor工作原理

ThreadPoolExecutor的工作原理如下:

ThreadPoolExecutor详解(定义作用及使用原理)-mikechen

  1. 当有新的任务提交到线程池时,线程池会判断当前线程池中的线程数是否小于核心线程数,如果是则创建一个新的线程来执行该任务;如果不是,则将任务放入任务队列中等待执行。
  2. 当任务队列中有任务等待执行时,线程池会从任务队列中取出一个任务,交给线程池中的空闲线程来执行。
  3. 如果当前线程池中的线程数已经达到核心线程数,但是任务队列中的任务仍然有未执行的,那么线程池会创建新的线程来执行任务,直到线程数达到最大线程数为止。
  4. 当线程池中的线程数超过核心线程数时,空闲线程的存活时间会受到控制,超过指定时间的线程会被销毁,以减少资源的占用。
  5. 当任务执行完成后,线程会将执行结果返回给线程池,线程池将执行结果保存到一个Future对象中,供调用者获取。

以上就是ThreadPoolExecutor详解,更多线程池内容,请查看:Java线程池(万字图文详解)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法