Java线程池几种简单使用方式

博客介绍了公共线程池工具类的调用示例,还说明了使用Spring注解自主配置线程池信息的方法,即在项目中加入特定代码,在需要异步的位置加@Async注解,启动类加@EnableAsync注解,同时指出调用本类子方法时加注解异步不生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.提供公共的线程池工具类,示例:

private static ThreadPoolTaskExecutor taskExecutor = null;
	private static Integer corePoolSize = 10;
	private static Integer maxPoolSize = 20;
	private static Integer queueCapacity = 1000;
    static {
        taskExecutor = new ThreadPoolTaskExecutor();
        // 核心线程数,队列未满之前可执行线程数是按照 core的size
        taskExecutor.setCorePoolSize(corePoolSize);
        // 最大线程数,原来50 8.10号改为20,队列满的时候执行线程数为max的size
        taskExecutor.setMaxPoolSize(maxPoolSize);
        // 队列最大长度
        taskExecutor.setQueueCapacity(queueCapacity);
        // 线程池维护线程所允许的空闲时间(单位秒)
        taskExecutor.setKeepAliveSeconds(120);
        // 线程池对拒绝任务(无线程可用)的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());

        taskExecutor.initialize();
    }

    public static void run(Runnable runnable) {
        taskExecutor.execute(runnable);
    }	

调用示例:

ThreadTaskUtils.run(new Runnable() {
	public void run() {
	    log.info("异步线程");	 
	}
});

2.使用spring注解,自主配置线程池信息,在项目中加入下面代码:

@Bean(name = "threadPoolTask")
	public ThreadPoolTaskExecutor getAsyncThreadPoolTaskExecutor() {
		logger.info("threadPoolTask start...");
		ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
		taskExecutor.setCorePoolSize(15);
		taskExecutor.setMaxPoolSize(50);
		taskExecutor.setQueueCapacity(5000);// 队列最大长度
		taskExecutor.setKeepAliveSeconds(200); // 线程池维护线程所允许的空闲时间
		taskExecutor.setThreadNamePrefix("test-pool-");
		// 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者
		taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		// 调度器shutdown被调用时等待当前被调度的任务完成
		taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
		// 等待时长
		taskExecutor.setAwaitTerminationSeconds(60);
		taskExecutor.initialize();
		return taskExecutor;
	}

在需要使用异步的位置,加上注解:@Async("threadPoolTask");

在启动类加上注解:@EnableAsync

注意事项:在调用本类子方法时,方法上加上注解无效,示例:

public void autoCheck() {
    checkOrder();
}
	
@Async("scheduledPoolTaskExecutor")
public void checkOrder() {

}

使用上面的写法,异步不生效。

<think>好的,我现在要处理用户关于Java线程池类型和实现方式的问题。首先,我需要回顾一下自己掌握的线程池相关知识,并结合提供的引用内容来组织回答。 用户的问题明确是询问Java线程池的类型和实现方式。根据引用内容,特别是引用[3]和[4],线程池的类型主要包括几种不同的内置线程池,比如单线程池、固定大小线程池、缓存线程池、调度线程池等。同时,实现方式可能涉及线程池的创建方法,比如通过Executors工厂类或者直接配置ThreadPoolExecutor参数。 首先,我需要确认Java线程池的主要类型。根据引用[3],提到了单线程化的线程池、ScheduledThreadPool等。另外,可能还有FixedThreadPool和CachedThreadPool。这些通常是通过Executors类提供的静态方法创建的。 接下来是线程池的实现方式。根据引用[4],线程池的实现可能涉及不同的创建方式,比如使用Callable和Future来接收返回值,或者通过Runnable接口。而引用[3]提到线程池的参数配置,比如核心线程数、最大线程数、阻塞队列类型等,这些参数在直接使用ThreadPoolExecutor构造函数时进行设置。 需要区分线程池的类型和它们的实现方式。类型指的是不同的线程池种类,而实现方式可能包括使用Executors工厂方法或者自定义ThreadPoolExecutor实例。此外,引用[2]提到线程池的原理和管理线程的生命周期,这也需要简要说明。 在组织回答时,应该先介绍线程池的基本概念,然后分类型和实现方式两部分详细说明。类型部分可以列出每种线程池的特点和使用场景,引用[3]中的例子,比如单线程池适用于串行任务,调度线程池用于定时任务等。实现方式部分需要说明如何通过Executors创建不同类型的线程池,或者通过ThreadPoolExecutor自定义参数配置。 还需要注意引用中的具体参数,例如单线程池的核心线程数和最大线程数都是1,阻塞队列是LinkedBlockingQueue,这些细节需要准确无误地呈现。同时,要提到线程池的工作流程,如任务提交后的处理顺序,当核心线程满后进入队列,队列满后创建非核心线程等,这些可能在引用[3]中有描述。 另外,用户可能对线程池的选择和优化感兴趣,所以在相关问题中可以生成一些关于如何选择线程池类型、参数配置优化或常见问题处理的问题。 需要确保回答的结构清晰,先概述线程池的重要性,然后分点讲解类型和实现方式,最后列出相关问题。同时,正确标注引用来源,例如在提到单线程池时添加[^3],在提到Executors工厂方法时引用[^2]或[^3]。 最后,检查是否有遗漏的线程池类型,比如ForkJoinPool是否属于标准线程池类型?根据常见知识,Java标准库中的Executors提供的类型通常包括Fixed、Cached、Single、Scheduled,而ForkJoinPool属于另一种类型,可能不在用户的问题范围内,但如果有引用提到的话需要包含。根据提供的引用中没有提到ForkJoinPool,所以可能不需要包括。 总结回答结构: 1. 引言:线程池的作用和重要性(引用[1][2]) 2. 线程池类型: - 单线程池 - 固定大小线程池 - 缓存线程池 - 调度线程池 3. 实现方式: - 使用Executors工厂类 - 自定义ThreadPoolExecutor参数 4. 参数配置和流程(引用[3]) 5. 相关问题生成 需要确保所有技术术语正确,比如LinkedBlockingQueue的正确拼写,参数名称的正确性,例如核心线程数、最大线程数等。同时,代码示例可能帮助说明,但用户没有要求代码,所以可能不需要,但如果有相关实现方式的说明会更好。 现在开始组织语言,用中文分点回答,引用正确的来源,并生成相关问题。</think>### Java线程池的类型与实现方式 Java线程池通过复用线程资源显著提升系统性能,其核心类型和实现方式如下: --- #### **一、线程池类型** Java通过`Executors`工厂类提供四种常用线程池(基于`ThreadPoolExecutor`实现): 1. **单线程池(SingleThreadExecutor)** - **参数**:核心线程数=1,最大线程数=1,使用无界队列`LinkedBlockingQueue`。 - **特点**:所有任务按提交顺序执行,适用于需要串行化的场景(如日志顺序处理)。 2. **固定大小线程池(FixedThreadPool)** - **参数**:核心线程数=最大线程数(用户指定),队列为无界`LinkedBlockingQueue`。 - **特点**:线程数量固定,适用于负载稳定的高并发场景(如HTTP请求处理)[^3]。 3. **缓存线程池(CachedThreadPool)** - **参数**:核心线程数=0,最大线程数=Integer.MAX_VALUE,队列为`SynchronousQueue`(不存储任务)。 - **特点**:线程空闲60秒后回收,适用于短时异步任务或低并发突发流量。 4. **调度线程池(ScheduledThreadPool)** - **参数**:核心线程数用户指定,最大线程数=Integer.MAX_VALUE,使用`DelayedWorkQueue`。 - **特点**:支持定时或周期性任务(如定时数据同步)。 --- #### **二、实现方式** 线程池可通过以下两种方式实现: 1. **使用`Executors`工厂类** 直接调用静态方法创建预配置线程池: ```java ExecutorService singleThreadPool = Executors.newSingleThreadExecutor(); ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(3); ``` 2. **自定义`ThreadPoolExecutor`参数** 通过构造函数灵活配置核心参数: ```java ThreadPoolExecutor customPool = new ThreadPoolExecutor( corePoolSize, // 核心线程数 maxPoolSize, // 最大线程数 keepAliveTime, // 非核心线程空闲存活时间 TimeUnit.SECONDS, new LinkedBlockingQueue<>(capacity), // 阻塞队列 RejectedExecutionHandler policy // 拒绝策略 ); ``` - **核心参数**:核心线程数、最大线程数、存活时间、队列容量、拒绝策略(如丢弃任务或抛出异常)。 - **工作流程**:任务提交后,优先由核心线程执行;核心线程满则进入队列;队列满则创建非核心线程;超出最大线程数则触发拒绝策略。 --- #### **三、线程池的优势** - **资源复用**:减少线程创建/销毁开销[^2]。 - **稳定性**:通过队列缓冲和拒绝策略避免资源耗尽[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值