线程池异步工厂快捷使用

1.线程池的配置创建

@Configuration
public class ThreadPoolConfig {

    // 核心线程池大小
    private int corePoolSize = 50;

    // 最大可创建的线程数
    private int maxPoolSize = 200;

    // 队列最大长度
    private int queueCapacity = 1000;

    // 线程池维护线程所允许的空闲时间
    private int keepAliveSeconds = 300;

    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        // 线程池对拒绝任务(无线程可用)的处理策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

    /**
     * 执行周期性或定时任务
     */
    @Bean(name = "scheduledExecutorService")
    protected ScheduledExecutorService scheduledExecutorService() {
        return new ScheduledThreadPoolExecutor(corePoolSize,
            new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) {
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                super.afterExecute(r, t);
                Threads.printException(r, t);
            }
        };
    }

    /**
     * Security异步认证定时任务 代理线程池
     */
    @Bean(name = "delegatingSecurityContextExecutorService")
    protected DelegatingSecurityContextExecutorService delegatingSecurityContextExecutorService() {
        return new DelegatingSecurityContextExecutorService(Executors.newFixedThreadPool(corePoolSize));
    }

2.异步管理器

import com.mega.common.utils.Threads;
import com.mega.common.utils.spring.SpringUtils;
import org.springframework.security.concurrent.DelegatingSecurityContextExecutorService;
import org.springframework.stereotype.Component;

import java.util.TimerTask;

/**
 * 异步任务管理器
 *
 * @author Jerry
 */
@Component
public class AsyncManager {
    /**
     * 操作延迟10毫秒
     */
    private final int OPERATE_DELAY_TIME = 10;

    /**
     * 异步操作任务调度线程池
     */
    private DelegatingSecurityContextExecutorService executor = SpringUtils.getBean("delegatingSecurityContextExecutorService");

    /**
     * 单例模式
     */
    private AsyncManager() {
    }

    private static AsyncManager me = new AsyncManager();

    public static AsyncManager me() {
        return me;
    }

    /**
     * 执行任务
     *
     * @param task 任务
     */
    public void execute(TimerTask task) {
        executor.execute(task);
    }

    /**
     * 停止任务线程池
     */
    public void shutdown() {
        Threads.shutdownAndAwaitTermination(executor);
    }
}

3.关闭线程

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.PreDestroy;

/**
 * 确保应用退出时能关闭后台线程
 *
 * @author Jerry
 */
@Component
public class ShutdownManager {
    private static final Logger logger = LoggerFactory.getLogger("sys-user");

    @PreDestroy
    public void destroy() {
        shutdownAsyncManager();
    }

    /**
     * 停止异步执行任务
     */
    private void shutdownAsyncManager() {
        try {
            logger.info("====关闭后台任务任务线程池====");
            AsyncManager.me().shutdown();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }
}

4. 异步工厂调用

/**
 * 异步工厂(产生任务用)
 *
 * @author Jerry
 */
@Component
@Slf4j
public class AsyncFactory {
    private static AsyncFactory asyncFactory;


    @PostConstruct
    public void init() {
        asyncFactory = this;
    }

	// 异步工厂调用例子
     /**
     * excel上传异步保存
     *
     * @param header
     * @param uploadCoordinationService
     * @return
     */
    public static TimerTask productionPlanHeaderSave(ProductionPlanHeader header, Class<?> uploadCoordinationService) {
        return new TimerTask() {
            @Override
            public void run() {
            	// 进行调取的具体实现方法
                Object uploadService = SpringUtils.getBean(uploadCoordinationService);
                if (uploadService instanceof UploadCoordinationService) {
                    ((UploadCoordinationService) uploadService).productionPlanHeaderSave(header);
                }
            }
        };
    } 

在Service业务层面可进行使用:

	AsyncManager.me().execute(AsyncFactory.productionPlanHeaderSave(header, this.getClass()));

如果项目中会使用到大量的异步线程操作,可选择集成为异步工厂来进行线程调用,安全可靠。

<think>好的,我现在要帮用户解决关于Java线程池执行任务的使用方法的问题。用户提供了几个引用资料,我需要先仔细看看这些内容,再结合自己的知识来组织回答。 首先,用户提到的引用1介绍了线程池的基础概念和优势,提到了ExecutorService以及不同的线程池实现。引用2列举了Executors类提供的各种线程池类型,比如newFixedThreadPool、newCachedThreadPool等,还提到了ThreadPoolExecutor手动创建的方式。引用3给出了一个示例,说明线程池如何处理任务队列和线程数量的关系。引用4详细说明了newFixedThreadPool的应用场景和示例代码。 用户的问题是如何使用线程池执行任务,需要具体的示例和方法。根据引用中的内容,我应该分步骤讲解,包括创建线程池、提交任务、关闭线程池,并给出不同类型的线程池示例。 首先,线程池的创建部分。根据引用2,可以通过Executors工厂类快速创建不同类型的线程池,比如newFixedThreadPool、newCachedThreadPool等。同时,手动创建ThreadPoolExecutor也是选项。引用3中的示例用了new ThreadPoolExecutor,并设置了核心线程数、最大线程数、队列容量等参数,所以可能需要说明两种创建方式:使用Executors快捷方法和手动配置参数。 接下来是任务提交,用户需要知道如何提交Runnable或Callable任务。根据引用3中的代码,executor.execute()用于提交Runnable任务,而submit方法可以处理Callable并返回Future。这里需要区分execute和submit的区别,并给出示例。 关闭线程池部分,引用4中的示例没有提到关闭,但实际使用中必须正确关闭,避免资源泄漏。需要介绍shutdown()和shutdownNow()的区别,以及如何等待任务完成。 然后,给出不同类型的线程池示例,比如固定大小、缓存线程池、单线程池等,引用2和4中的内容可以作为参考。例如,newFixedThreadPool适用于固定线程数,newCachedThreadPool适合任务数量波动大的情况。 另外,要注意线程池的配置参数,如核心线程数、最大线程数、队列类型等,这些影响线程池的行为。引用3的例子中,核心线程是2,最大线程20,队列容量10,当任务超过队列容量时,线程池会创建新线程直到达到最大数。 最后,可能需要提到实际开发中的最佳实践,比如使用ThreadPoolExecutor手动创建以便更精细控制参数,避免使用无界队列导致内存问题,以及合理处理任务拒绝策略等。 现在需要组织这些内容,结构清晰,分步骤说明,并附上代码示例。同时,生成相关问题,如线程池参数配置、拒绝策略、对比不同线程池类型等,帮助用户进一步学习。</think>### Java线程池执行任务的使用方法 #### 一、线程池基础使用步骤 1. **创建线程池** 通过`Executors`工厂类快速创建线程池,或手动配置`ThreadPoolExecutor`参数。 示例(固定大小线程池): ```java ExecutorService executor = Executors.newFixedThreadPool(5); // 固定5个线程[^4] ``` 2. **提交任务** - 使用`execute()`提交`Runnable`任务: ```java executor.execute(() -> System.out.println("Task executed by thread: " + Thread.currentThread().getName())); ``` - 使用`submit()`提交`Callable`任务并获取`Future`对象: ```java Future<String> future = executor.submit(() -> "Result of Callable task"); ``` 3. **关闭线程池** - `shutdown()`:等待所有任务完成后再关闭。 - `shutdownNow()`:立即中断所有任务并关闭。 ```java executor.shutdown(); ``` --- #### 二、完整示例代码 ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolDemo { public static void main(String[] args) { // 创建固定5线程的线程池 ExecutorService executor = Executors.newFixedThreadPool(5); // 提交10个任务 for (int i = 0; i < 10; i++) { final int taskId = i; executor.execute(() -> { System.out.println("执行任务 " + taskId + ",线程:" + Thread.currentThread().getName()); }); } // 关闭线程池 executor.shutdown(); } } ``` **执行结果**: 任务会被分配给最多5个线程执行,例如: ``` 执行任务 0,线程:pool-1-thread-1 执行任务 1,线程:pool-1-thread-2 执行任务 2,线程:pool-1-thread-3 ... ``` --- #### 三、不同线程池类型对比 | 线程池类型 | 特点 | 适用场景 | |-------------------------------------|----------------------------------------------------------------------|-----------------------------| | `newFixedThreadPool` | 固定线程数,队列无界 | 服务器连接处理、稳定并发需求 | | `newCachedThreadPool` | 线程数动态扩展,空闲线程自动回收 | 短期异步任务,负载波动较大 | | `newSingleThreadExecutor` | 单线程,任务按顺序执行 | 需顺序执行的任务(如日志写入) | | `newScheduledThreadPool` | 支持定时或周期性任务 | 定时任务调度 | --- #### 四、手动配置线程池参数 通过`ThreadPoolExecutor`自定义核心参数: ```java ThreadPoolExecutor customExecutor = new ThreadPoolExecutor( 2, // 核心线程数 20, // 最大线程数 60, // 空闲线程存活时间(秒) TimeUnit.SECONDS, new LinkedBlockingQueue<>(10) // 任务队列容量 ); ``` **行为说明**: - 前2个任务由核心线程执行; - 第3-12个任务进入队列; - 第13-20个任务触发创建新线程[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带着希望活下去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值