1、在创建了线程池后,等待提交过来的任务请求。 2、ThreadPoolExecutor执行execute方法,线程池会做如下判断: 如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁)。 如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。 如果无法将任务加入BlockingQueue(队列已满...
从构造方法可以看出 ThreadPoolExecutor 的主要参数 7 个,在其注释上也有说明功能,咱们翻译下每个参数的功能: corePoolSize: 线程池核心线程数(平时保留的线程数),使用时机: 在初始时刻,每次请求进来都会创建一个线程直到达到该size maximumPoolSize: 线程池最大线程数,使用时机: 当workQueue都放不下时,启动新线程,...
corePoolSize:核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来...
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); } corePoolSize 线程池中的核心线程数,当提...
如果我们要Exectutors来创建线程池,基本离不开上面几个方法,我们可以看出上面几个方法中都用到了ThreadPoolExecutor这个类,且都返回ExecutorService对象。我们先看一下ExecutorService的主要方法。 public interface ExecutorService extends Executor { void shutdown(); ...
想要获得一个FutureTask, 首先要提供一个Callable对象, FutureTask提供了一个单参数的构造函数, 支持传递一个Callable对象, 内部还设置了一个状态属性state, 初始化为NEW(int类型, 值为0), 并且这个state是一个volatile的, 以供其它同时调用get()方法的线程第一时间知道任务完成了. ...
下面解释下一下构造器中各个参数的含义: corePoolSize:核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出...
线程池创建两种方式 方式一:通过ThreadPoolExecutor构造函数来创建(推荐)。方式二:通过Executor框架的...