自定义线程池

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * @ClassName ExecutorConfig
 * @Author ZhangRF
 * @CreateDate 2021/01/29
 * @Decription
 */
@Configuration
@EnableAsync
@EnableScheduling
@Slf4j
public class ExecutorConfig implements SchedulingConfigurer, AsyncConfigurer {
    /**
     * 定时任务使用的线程池
     *
     * @return
     */
    @Bean(destroyMethod = "shutdown", name = "taskScheduler")
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        scheduler.setThreadNamePrefix("task-");
        scheduler.setAwaitTerminationSeconds(600);
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        return scheduler;
    }

    /**
     * 异步任务执行线程池
     *
     * @return
     */
    @Bean(name = "asyncExecutor")
    public ThreadPoolTaskExecutor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(1000);
        executor.setQueueCapacity(4000);
        executor.setKeepAliveSeconds(60);//线程空闲后的最大存活时间
        executor.setMaxPoolSize(5000);
        executor.setThreadNamePrefix("taskExecutor-");
        executor.setRejectedExecutionHandler(ExecutorConfig::rejectedExecution);
        executor.initialize();
        return executor;
    }

    /**
     * 异步http任务执行线程池
     *
     * @return
     */
    @Bean(name = "asyncHttpExecutor")
    public ThreadPoolTaskExecutor asyncHttpExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(1000);
//        executor.setQueueCapacity(1000);//等待队列
        executor.setKeepAliveSeconds(60);
        executor.setMaxPoolSize(10000);
        executor.setThreadNamePrefix("taskHttpExecutor-");
        executor.setRejectedExecutionHandler(ExecutorConfig::rejectedExecution);
        executor.initialize();
        return executor;
    }

    /**
     * java自定义线程池
     *
     * @return
     */
    public ExecutorService executorService() {
        return new ThreadPoolExecutor(
                500,//核心大小
                1500,//最大线程数
                1000,//1000
                TimeUnit.MILLISECONDS,//ms
                new SynchronousQueue<Runnable>(),//队列
                Executors.defaultThreadFactory(),//线程工厂
                ExecutorConfig::rejectedExecution//决绝策略,超过最大线程数进行等待
        );
    }

    /**
     * java自定义线程池;自定义线程前缀
     *
     * @return
     */
    public ExecutorService executorService(String threadNamePrefix) {
        return new ThreadPoolExecutor(
                500,//核心大小
                1500,//最大线程数
                1000,//1000
                TimeUnit.MILLISECONDS,//ms
                new SynchronousQueue<Runnable>(),//队列
                new CustomizableThreadFactory(threadNamePrefix),//线程工厂
                ExecutorConfig::rejectedExecution//决绝策略,超过最大线程数进行等待
        );
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler taskScheduler = taskScheduler();
        scheduledTaskRegistrar.setTaskScheduler(taskScheduler);
    }

    @Override
    public Executor getAsyncExecutor() {
        return asyncExecutor();
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (throwable, method, objects) -> {
            log.error("异步任务执行出现异常, message {}, emthod {}, params {}", throwable, method, objects);
            log.error("throwable {}", throwable.toString());
            log.error("emthod {}", method.toString());
        };
    }

    private static void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        if (!executor.isShutdown()) {
            try {
//                log.info("start get queue");
                executor.getQueue().put(r);
//                log.info("end get queue");
            } catch (InterruptedException e) {
                log.error(e.toString(), e);
                Thread.currentThread().interrupt();
            }
        }
    }

    public static void main(String[] args) {
        ExecutorService test = new ExecutorConfig().executorService("test");
        List<Future> list = new ArrayList<>();//

        for (int i = 0; i < 100; i++) {
            int finalI = i;
            Future submit = test.submit((Callable) () -> new ExecutorConfigTest().str(finalI));
            list.add(submit);
        }

        test.shutdown();
        while (true) {
            if (test.isTerminated()) {
                list.stream().forEach(future -> {
                    //打印结果
                    try {
                        System.out.println(future.get().toString());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
                break;
            }
        }
        test.shutdownNow();
    }
}

 

posted @ 2021-12-09 14:53  怕黑,可是却恋上了夜  阅读(75)  评论(0编辑  收藏  举报