spring對java線程池封裝源碼解析

來源:互聯網
上載者:User

spring的 ThreadPoolTaskExecutor類最終是通過調用java 的ThreadPoolExecutor的void execute(Runnable task)方法或Future<?> submit(Runnable task)方法執行任務的

 

下面是spring的任務執行類和介面的繼承層次

interface Executor

     void execute(Runnable command);

interface TaskExecutor extends Executor

    void execute(Runnable task);

interface AsyncTaskExecutor extends TaskExecutor

    void execute(Runnable task, long startTimeout);

    Future<?> submit(Runnable task);

    <T> Future<T> submit(Callable<T> task);

interface SchedulingTaskExecutor extends AsyncTaskExecutor

     boolean prefersShortLivedTasks();

 任務執行類

class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport implements SchedulingTaskExecutor

 成員變數

private ThreadPoolExecutor threadPoolExecutor;

執行任務方法

public void execute(Runnable task) {
Executor executor = getThreadPoolExecutor();
try {
executor.execute(task);
}
catch (RejectedExecutionException ex) {
throw new TaskRejectedException("Executor [" + executor + "] did not accept task: " + task, ex);
}
}

 

public ThreadPoolExecutor getThreadPoolExecutor() throws IllegalStateException {
Assert.state(this.threadPoolExecutor != null, "ThreadPoolTaskExecutor not initialized");
return this.threadPoolExecutor;
}

基類ExecutorConfigurationSupport

abstract class ExecutorConfigurationSupport extends CustomizableThreadFactory
implements BeanNameAware, InitializingBean, DisposableBean

其中基類CustomizableThreadFactory為自訂線程工廠類

 成員變數

private ExecutorService executor;

生命週期初始化
public void afterPropertiesSet() {
initialize();
}

初始化方法

/**
* Set up the ExecutorService.
*/
public void initialize() {
if (logger.isInfoEnabled()) {
logger.info("Initializing ExecutorService " + (this.beanName != null ? " '" + this.beanName + "'" : ""));
}
if (!this.threadNamePrefixSet && this.beanName != null) {
setThreadNamePrefix(this.beanName + "-");
}
this.executor = initializeExecutor(this.threadFactory, this.rejectedExecutionHandler);
}

 抽象方法(子類ThreadPoolTaskExecutor實現)

protected abstract ExecutorService initializeExecutor(
ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler);

生命週期銷毀方法

public void destroy() {
shutdown();
}

 ThreadPoolTaskExecutor實現ExecutorService initializeExecutor(ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler);方法

protected ExecutorService initializeExecutor(
ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) {

BlockingQueue<Runnable> queue = createQueue(this.queueCapacity);
ThreadPoolExecutor executor = new ThreadPoolExecutor(
this.corePoolSize, this.maxPoolSize, this.keepAliveSeconds, TimeUnit.SECONDS,
queue, threadFactory, rejectedExecutionHandler);
if (this.allowCoreThreadTimeOut) {
executor.allowCoreThreadTimeOut(true);
}

this.threadPoolExecutor = executor;
return executor;
}

我們注意到上面的方法 initializeExecutor(ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler)是父類ExecutorConfigurationSupport調用的,初始化父類成員變數private ExecutorService executor;

 

而ThreadPoolTaskExecutor實際執行任務是採用的自身成員變數private ThreadPoolExecutor threadPoolExecutor;

public ThreadPoolExecutor getThreadPoolExecutor() throws IllegalStateException {
Assert.state(this.threadPoolExecutor != null, "ThreadPoolTaskExecutor not initialized");
return this.threadPoolExecutor;
}

不明白這裡為什麼要這麼處理?

再看其他部分

ExecutorConfigurationSupport 裡面配置預設拒絕策略

private RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.AbortPolicy();

ThreadPoolTaskExecutor成員變數

private int corePoolSize = 1;

private int maxPoolSize = Integer.MAX_VALUE;//預設最大線程池

private int keepAliveSeconds = 60;

private boolean allowCoreThreadTimeOut = false;

private int queueCapacity = Integer.MAX_VALUE;//預設隊列容量

阻塞隊列建立方法

protected BlockingQueue<Runnable> createQueue(int queueCapacity) {
if (queueCapacity > 0) {
return new LinkedBlockingQueue<Runnable>(queueCapacity);
}
else {
return new SynchronousQueue<Runnable>();
}
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.