spring之线程池集成

spring之线程池集成

        spring的线程池技术使用的是ThreadPoolTaskExecutor,当我们点进ThreadPoolTaskExecutor这个类的时候,可以看见里面是对于JDK中的ThreadPoolExecutor的封装:


可见,ThreadPoolExecutor是ThreadPoolTaskExecutor类的一个属性.而其他几个属性正好也是ThreadPoolTaskExecutor的几个重要参数:

        CorePoolSize:                        线程池维护线程的最小数量,默认值为1.

        MaxPoolSize:                         线程池维护线程的最大数量,默认值为2的32次方-1,即2147483647.

        KeepAliveSeconds:                空闲线程的存活时间,默认值是60s.

        QueueCapacity:                     队列的最大长度,默认值为2的32次方-1,即2147483647.

        AllowCoreThreadTimeOut:    是否允许核心线程空闲退出,默认是false.

        RejectedExecutionHandler:      拒绝策略.这是ExecutorConfigurationSupport类中的方法,他是ThreadPoolExecutor的父类.

拒绝策略有以下四种:

        ThreadPoolExecutor.AbortPolicy:                丢弃任务并抛出RejectedExecutionException异常.(默认使用)

        ThreadPoolExecutor.DiscardPolicy:             丢弃任务,但是不不抛出异常.

        ThreadPoolExecutor.DiscardOldestPolicy:   丢弃队列最前面的任务,然后重新尝试执行.

        ThreadPoolExecutor.CallerRunsPolicy:        有调用线程处理该任务.

        下面直接上代码:

                首先是异步任务类:

package com.yczuoxin.demo.config;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class AsyncTask {
    /** 表示异步执行 */
    @Async
    public void executeAsyncTask(Integer i){
        System.out.println("执行异步任务: " + i);
    }

    /** 表示异步执行 */
    @Async
    public void specialExecuteAsyncTask(Integer i){
        System.out.println("执行特殊异步任务: " + i);
    }
}

                下面是配置类:

package com.yczuoxin.demo.config;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
/** 开启异步支持 */
@EnableAsync
@ComponentScan("com.yczuoxin.demo.config")
public class TaskExecutorConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

                最后是测试类:

package com.yczuoxin.demo.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TaskTest {
    public static void main(String[] args) {

        int count = 10;

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
        AsyncTask task = context.getBean(AsyncTask.class);
        for (int i = 0; i < count; i++) {
            task.executeAsyncTask(i);
            task.specialExecuteAsyncTask(i);
        }

        context.close();
    }
}

                测试结果如下图:


        首先可以看见执行的结果并不是有序的.在执行一遍结果又不相同.异步线程池创建成功.

猜你喜欢

转载自blog.csdn.net/ycxzuoxin/article/details/80928471