java线程池是同步还是异步的_Spring线程池(同步、异步)

本文详细介绍了Spring线程池的同步和异步执行器,包括SimpleAsyncTaskExecutor、SyncTaskExecutor、ThreadPoolTaskExecutor等,强调了它们的区别和应用场景。Spring的ThreadPoolTaskExecutor是线程池实现,提供了丰富的配置选项。文章还提到了@Async注解的异步调用以及如何自定义线程池。
摘要由CSDN通过智能技术生成

一、spring异步线程池类图

be3b045f94b88e47b8b9366ae3001abc.png

b2877bd210d507dea4d4d1652bbbc18b.png

97cca50a52a1955a02cb74dd15ab3c6f.png

二、简单介绍

TaskExecutor:Spring异步线程池的接口类,其实质是java.util.concurrent.Executor。

以下是官方已经实现的全部7个TaskExecuter。Spring宣称对于任何场景,这些TaskExecuter完全够用了:

名字特点

SimpleAsyncTaskExecutor

每次请求新开线程,没有最大线程数设置.不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。

SyncTaskExecutor

不是异步的线程.同步可以用SyncTaskExecutor,但这个可以说不算一个线程池,因为还在原线程执行。这个类没有实现异步调用,只是一个同步操作。

ConcurrentTaskExecutor

Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。

SimpleThreadPoolTaskExecutor

监听Spring’s lifecycle callbacks,并且可以和Quartz的Component兼容.是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。

ThreadPoolTaskExecutor

最常用。要求jdk版本大于等于5。可以在程序而不是xml里修改线程池的配置.其实质是对java.util.concurrent.ThreadPoolExecutor的包装。

TimerTaskExecutor

WorkManagerTaskExecutor

三、Spring的同步执行器

1、SyncTaskExecutor:同步可以用SyncTaskExecutor,但这个可以说不算一个线程池,因为还在原线程执行。这个类没有实现异步调用,只是一个同步操作,一般不会用。

2、可以用ThreadPoolTaskExecutor结合FutureTask做到同步。

3、SyncTaskExecutor与ThreadPoolTaskExecutor区别:前者是同步执行器,执行任务同步,后者是线程池,执行任务异步。

四、Spring的异步执行器

异步执行用户任务的SimpleAsyncTaskExecutor。每次执行客户提交给它的任务时,它会启动新的线程,并允许开发者控制并发线程的上限(concurrencyLimit),从而起到一定的资源节流作用。默认时,concurrencyLimit取值为-1,即不启用资源节流。

SimpleAsyncTaskExecutor

主要实现:

支持限流处理:ConcurrencyThrottleSupport和ConcurrencyThrottleInterceptor实现。

异步注册线程返回结果:ListenableFutureTask主要是对JDK的FutureTask进行封装,覆盖了原始的run方法,在run中封装可以获取到线程的返回值。

public class SimpleAsyncTaskExecutor extends CustomizableThreadCreator implementsAsyncListenableTaskExecutor, Serializable {//限流主要实现

private final SimpleAsyncTaskExecutor.ConcurrencyThrottleAdapter concurrencyThrottle = newSimpleAsyncTaskExecutor.ConcurrencyThrottleAdapter();privateThreadFactory threadFactory;//设置最大的线程数量

public void setConcurrencyLimit(intconcurrencyLimit) {this.concurrencyThrottle.setConcurrencyLimit(concurrencyLimit);

}//是否开启了限流 限流数量大于0?

public final booleanisThrottleActive() {return this.concurrencyThrottle.isThrottleActive();

}//1.是否开启限流 否则不开启限流处理//2.执行开始之前检测是否可以满足要求 当前数量++//3.开启限流将执行的Runable进行封装,执行完成调用final方法 当前数量--

public void execute(Runnable task, longstartTimeout) {

Assert.notNull(task,"Runnable must not be null");if(this.isThrottleActive() && startTimeout > 0L) {this.concurrencyThrottle.beforeAccess();this.doExecute(newSimpleAsyncTaskExecutor.ConcurrencyThrottlingRunnable(task));

}else{this.doExecute(task);

}

}//异步提交有返回值

public Future>submit(Runnable task) {

FutureTask future= new FutureTask(task, (Object)null);this.execute(future, 9223372036854775807L);returnfuture;

}public Future submit(Callabletask) {

FutureTask future= newFutureTask(task);this.execute(future, 9223372036854775807L);returnfuture;

}public ListenableFuture>submitListenable(Runnable task) {

ListenableFutureTask future= new ListenableFutureTask(task, (Object)null);this.execute(future, 92233720

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值