返回

ThreadPoolExecutor keepAliveTime 实现原理和源码分析

后端

线程池简介

线程池(ThreadPool)是一种管理线程的机制,它允许您创建和管理一组线程,以便可以根据需要使用它们来执行任务。线程池的主要优点在于它可以提高应用程序的性能和可扩展性。

线程池的 keepAliveTime 属性用于设置线程池中线程的空闲时间。如果一个线程在 keepAliveTime 时间内没有被使用,则它将被销毁。这可以帮助防止线程池中积累过多空闲线程,从而降低内存使用和开销。

ThreadPoolExecutor 实现原理

ThreadPoolExecutor 是 Java 并发包中用于管理线程池的类。ThreadPoolExecutor 的 keepAliveTime 属性是一个 long 类型的值,它表示线程池中线程的空闲时间,单位为毫秒。

当 ThreadPoolExecutor 创建一个新的线程时,它会将该线程的空闲时间设置为 keepAliveTime。如果该线程在 keepAliveTime 时间内没有被使用,则它将被销毁。

ThreadPoolExecutor 还提供了一个方法来设置线程池的 keepAliveTime 属性。该方法是 setKeepAliveTime(long keepAliveTime)。

源码分析

ThreadPoolExecutor 的 keepAliveTime 属性在 ThreadPoolExecutor.java 文件中定义。该属性是一个 long 类型的值,它表示线程池中线程的空闲时间,单位为毫秒。

private long keepAliveTime;

ThreadPoolExecutor 的构造函数中,keepAliveTime 属性被初始化为 60 秒。

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

当 ThreadPoolExecutor 创建一个新的线程时,它会将该线程的空闲时间设置为 keepAliveTime。

protected Thread addThread(Runnable firstTask, boolean core) {
    ...
    thread.setKeepAliveTime(keepAliveTime);
    ...
}

如果该线程在 keepAliveTime 时间内没有被使用,则它将被销毁。

protected void onTermination(Thread t) {
    ...
    if (!t.isAlive()) {
        recycledThreads.remove(t);
        terminatedThreads++;
        if (terminatedThreads >= workerCount) {
            terminated = true;
        }
    }
    ...
}

总结

ThreadPoolExecutor 的 keepAliveTime 属性用于设置线程池中线程的空闲时间。如果一个线程在 keepAliveTime 时间内没有被使用,则它将被销毁。这可以帮助防止线程池中积累过多空闲线程,从而降低内存使用和开销。