很多人会直接只用@Async来执行异步操作。但是这里面有服务器托管网一个问题,如果都是用spring的默认实现,是有坑的。
当我们开启EnableAsync注解 就可以使用@Async注解来执行异步操作了。
我们现在通过EnableAsync注解去打开spring异步世界的坑。
走JDK的动态代理:
最终走到这儿来了:Annota服务器托管网tionAsyncExecutionInterceptor#getDefaultExecutor(BeanFactory)
问题就在这里,如果我们自己没有定义Executor,也就是上面从容器beanFactory 中拿不到Executor 那么就会使用–SimpleAsyncTaskExecutor,这玩意儿实际上根本不是线程池!!!!!
请看它的doExecute 方法,直接new新的线程。
所以这玩意儿一直都是在创建新的 线程执行任务。。。。。
修改方式:
方案1.@Async 指定我们自己的线程池执行:@Async(“自己线程池beanName”)
方案2:回到AnnotationAsyncExecutionInterceptor#getDefaultExecutor(BeanFactory) 方法,看它如何获取线程池的:
要么我们自己配置一个TaskExecutor, 要么我们把我自己配置的线程池的名字叫做 taskExecutor 。这个常量的值:
DEFAULT_TASK_EXECUTOR_BEAN_NAME = “taskExecutor”,这样可以避免使用SimpleAsyncTaskExecutor。
方案3:实现AsyncConfigurer 接口作为一个配置类交给spring管理,通过getAsyncExecutor 方法配置异步线程池。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
Unity是如何编译运行C#的 (1)Unity会通过编译器将C#脚本编译成IL指令。 Unity会通过Roslyn来对C#代码进行编译,生成中间IL指令集。 当我们每次修改或者添加新的C#代码文件,Unity界面的右下角会出现短暂的“转圈”现象。这就意味着引…