`
dreamoftch
  • 浏览: 496806 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ThreadPoolExecutor corepoolsize 理解

阅读更多

 

在用jdk自带的jvm查看工具(bin/jvisualvm.exe) jvisualvm查看项目的运行状况的时候,发现Thread一只在增加(Thread dump),故进一步了解了一下ThreadPoolExecutor。

 

ThreadPoolExecutor 的 corePoolSize 的理解:

 

根据ThreadPoolExecutor的官方doc文档说明:When a new task is submitted in method execute(java.lang.Runnable), and fewer than corePoolSize threads are running, a new thread is created to handle the request, even if other worker threads are idle.

 

可以看出这个corePoolSize 的意思是说:当外部来了一个execute的请求,如果这时候正在运行状态的线程数 < corePoolSize 的时候,就会创建一个新的Thread去处理。但是需要注意的是,一个ThreadPoolExecutor 在创建之初,是不会立即初始化corePoolSize数量的Thread的,而是通过外部request来一个一个的创建,当达到corePoolSize数目之后,就会维持至少corePoolSize数目的Thread在pool中,哪怕他们都处于空闲状态(idle).

 

通过例子更好理解一点,下面用ThreadPoolExecutor的子类ScheduledThreadPoolExecutor做例子:

 

 

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class MyTest {
    
    private static AtomicInteger sequenceNumGenerator = new AtomicInteger();
    
    public static void main(String[] args) throws Exception {
        //pool with corePoolSize 10
        ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(10);
        
        //print the active thread and total thread num when pool created
        System.out.println(pool.getActiveCount());
        System.out.println(pool.getPoolSize());
        
        //execute 2 task
        pool.execute(getTask());
        pool.execute(getTask());
        
        //print the active thread and total thread num when tasks not finish
        System.out.println(pool.getActiveCount());
        System.out.println(pool.getPoolSize());
        
        //wait to ensure all tasks finish
        Thread.sleep(3000);
        
        //print the active thread and total thread num when all tasks finish
        System.out.println(pool.getActiveCount());
        System.out.println(pool.getPoolSize());
        
        //shutdown thread pool
        pool.shutdown();
    }
    
    private static Runnable getTask(){
        return new Runnable(){
            @Override
            public void run() {
                int sequenceNum = sequenceNumGenerator.incrementAndGet();
                System.out.println("begin task " + sequenceNum);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("finish task " + sequenceNum);
            }
        };
    }
}

 

 

 

 

 

根据结果可以看出:

 

ThreadPool在初始化的时候,active的thread 和 pool中的thread总数量都是0.也就是说没有初始化任何的thread

 

执行2个task,并且在task结束之前, active的thread 和 pool中的thread总数量都是2

 

在执行了2个task之后,并且在task都结束了之后, active的thread 和 pool中的thread总数量分别是0和2

 

这样就很清楚了,ThreadPoolExecutor的corePoolSize 数量的thread并不是在ThreadPoolExecutor创建的时候就理解初始化的,而是慢慢的通过外部的调用(例如调用execute)来一个一个的创建,最终达到corePoolSize 数量。

 

下面修改一下corePoolSize,让执行的task数量大于corePoolSize:

 

 

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class MyTest {
    
    private static AtomicInteger sequenceNumGenerator = new AtomicInteger();
    
    public static void main(String[] args) throws Exception {
        //pool with corePoolSize 10
        ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(3);
        
        //print the active thread and total thread num when pool created
        System.out.println(pool.getActiveCount());
        System.out.println(pool.getPoolSize());
        
        //execute 2 task
        pool.execute(getTask());
        pool.execute(getTask());
        pool.execute(getTask());
        pool.execute(getTask());
        
        //print the active thread and total thread num when tasks not finish
        System.out.println(pool.getActiveCount());
        System.out.println(pool.getPoolSize());
        
        //wait to ensure all tasks finish
        Thread.sleep(4000);
        
        //print the active thread and total thread num when all tasks finish
        System.out.println(pool.getActiveCount());
        System.out.println(pool.getPoolSize());
        
        //shutdown thread pool
        pool.shutdown();
    }
    
    private static Runnable getTask(){
        return new Runnable(){
            @Override
            public void run() {
                int sequenceNum = sequenceNumGenerator.incrementAndGet();
                System.out.println("begin task " + sequenceNum);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("finish task " + sequenceNum);
            }
        };
    }
}

 

 

就会发现ThreadPoolExecutor在所以task完成之后,会维持corePoolSize数量的thread在threadpool中,哪怕这些task已经完成工作,处于空闲状态(idle)

 

 

 

分享到:
评论

相关推荐

    ThreadPoolExecutor运转机制介绍

    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue&lt;Runnable&gt; workQueue, ThreadFactory threadFactory, RejectedExecutionHandler ...

    Android之线程池ThreadPoolExecutor的简介

    Android中的线程池ThreadPoolExecutor解决了单线程下载数据的效率慢和线程阻塞的的问题,它的应用也是优化...&lt;span xss=removed&gt;ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,

    Java ThreadPoolExecutor的参数深入理解

    Java ThreadPoolExecutor参数深入理解 Java ThreadPoolExecutor是Java并发编程中一个非常重要的组件,它提供了一种灵活的方式来管理线程池。ThreadPoolExecutor的参数深入理解是Java开发人员需要掌握的重要知识点,...

    线程池ThreadPoolExecutor原理源码分析.md

    本文将围绕 `ThreadPoolExecutor` 的核心方法 `execute()` 进行深入解析,帮助读者更好地理解其内部机制。 #### 二、构造方法 `ThreadPoolExecutor` 提供了一个构造函数,用于初始化线程池: ```java public ...

    JDK之ThreadPoolExecutor源码分析1

    本文将深入解析ThreadPoolExecutor的execute()方法执行流程,以帮助我们理解线程池的工作原理。 当一个任务被提交到线程池,线程池的执行策略主要分为四步: 1. 首先,线程池会检查当前的核心线程数是否已达到设定...

    Java线程池与ThreadPoolExecutor.pdf

    Java线程池是Java并发编程中...总结来说,理解并正确使用Java线程池和ThreadPoolExecutor对于优化Java应用程序的并发性能至关重要。通过调整线程池的参数,可以平衡资源利用率和系统响应时间,从而提高整体的系统效率。

    使用线程池ThreadPoolExecutor 抓取论坛帖子列表

    1. `corePoolSize`: 核心线程数,即使无任务执行,线程池也会保持这些线程不被销毁。 2. `maximumPoolSize`: 最大线程数,超过这个数量的任务会被放入任务队列等待。 3. `keepAliveTime`: 当线程数量超过核心线程数...

    java 中ThreadPoolExecutor原理分析

    ThreadPoolExecutor 的构造函数参数包括 corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory 和 handler。这些参数的含义分别是: * corePoolSize:线程池核心线程数,即最少需要保持...

    Android线程池管理的代码例子

    通过以上代码示例和注意事项,你可以更好地理解和应用Android中的线程池管理,提高应用的并发处理能力和响应速度。在实际项目中,结合具体业务需求,灵活运用ThreadPoolExecutor和ScheduledExecutorService,将有助...

    java面试题高级, 对底层高并发深入理解

    5. **线程池原理**:ThreadPoolExecutor的构造参数,如corePoolSize、maximumPoolSize、keepAliveTime以及workQueue的作用。理解线程池的拒绝策略,如AbortPolicy、CallerRunsPolicy、DiscardPolicy和...

    Android开发中线程池的使用Demo

    Java提供了一些内置的ExecutorService实现,如ThreadPoolExecutor,它允许我们自定义线程池的参数,如核心线程数、最大线程数、线程存活时间等。 在Android中,通常推荐使用`ThreadPoolExecutor`,因为它提供了更多...

    java 线程池实现多并发队列后进先出

    Java线程池是一种高效管理...在实际应用中,理解线程池的工作原理以及如何定制工作队列,对于优化并发性能和避免资源浪费至关重要。通过选择合适的线程池配置和队列类型,可以有效提高系统的响应速度和并发处理能力。

    线程池使用示例(含源代码)

    在提供的"线程池示例"文件中,应该包含了创建和使用线程池的代码示例,你可以参考并进行扩展,例如添加更多任务、调整线程池参数,或者实现自定义的线程工厂和拒绝策略,以加深对线程池的理解。

    java线程池对象ThreadPoolExecutor的深入讲解

    Java线程池是一种高效管理线程资源的工具,它的核心组件是`ThreadPoolExecutor`类,它在Java的`java.util.concurrent`包中。...理解其构造参数和工作原理,能够帮助开发者根据实际需求定制适合的线程池,优化系统性能。

    java 四种线程池实例

    总之,Java线程池提供了一种强大的工具来管理和优化并发任务的执行,理解并熟练使用各种线程池实例能够显著提升程序的效率和可维护性。在设计系统时,应该充分考虑线程池的选择和配置,以适应不同类型的异步任务需求...

    Java线程池,正式上线运行的源码,分享欢迎使用并提意见

    在Java中,`java.util.concurrent`包提供了线程池的相关实现,最核心的类是`ExecutorService`、`ThreadPoolExecutor`和`Executors`工厂类。本文将深入探讨线程池的工作原理和如何使用。 **1. ExecutorService接口**...

    jvm优化学习资源学习及讲义说明

    7. **线程与锁优化**:理解线程池的配置(如ThreadPoolExecutor的corePoolSize, maximumPoolSize, keepAliveTime等参数),死锁的检测和避免,以及锁的升级过程(从偏向锁到轻量级锁再到重量级锁)。 8. **编译优化...

    threadPoolDemo

    Java线程池是Java并发编程中的重要组成部分,它在多线程环境下的高效运行和资源...总之,Java线程池是Java多线程编程中不可或缺的工具,理解和掌握线程池的原理及配置,能够帮助我们编写出更加高效、稳定的并发程序。

    线程池java

    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue&lt;Runnable&gt; workQueue); ``` - **`corePoolSize`**:线程池的基本大小,在任何时间都会...

Global site tag (gtag.js) - Google Analytics