品牌型号:联想拯救者R7000
系统:Windows 10专业版
软件版本:Spring Boot 4.0.2
我们在学习Java基础时,有单线程和多线程的概念,很多人都不知道Spring是多线程还是单线程,尤其是学习到Spring Batch时,更难理解Spring Batch多线程和chunk的关系。本文将为大家介绍Spring是多线程还是单线程,Spring Batch多线程和chunk的关系的相关内容。
一、Spring是多线程还是单线程
实际上Spring框架本身没有固定的单线程或者多线程,具体情况取决于我们使用的Spring组件、Bean的配置方式,甚至是具体的业务场景,可以通过多种方式创建多线程。下面我就详细为大家介绍一下Spring的线程特性。
Spring的核心是IOC容器,这个容器本身初始化的时候是单线程的,也就是容器启动时,会按顺序创建Bean,但Bean创建完成后,它是单线程还是多线程运行,就由我们的配置决定了。比如Spring默认创建的Bean都是单例,可以被多个线程共享,而原型Bean【@Scope("prototype")注解标注的Bean】,每次使用都会创建新的实例,每个线程用自己的Bean,天然线程安全,但创建开销大,例如下图就是创建原型Bean的代码。

如果要在代码中实现多线程,可以通过集成Thread类,实现Runnable接口、实现Callable接口、线程池创建等多种方式,另外还可以使用@Async注解,这是比较容易上手的Spring多线程实现方式,下面就为大家介绍一下具体步骤。
1、启动类添加【@EnableAsync】,开启异步支持。

2、创建配置类,定义简单线程池,指定核心参数,例如:核心线程数、最大线程数、等待队列等,具体参数含义需要了解Spring线程池参数。该步骤非必须,但是建议手动配置,避免线程池安全隐患。

3、创建异步方法,并且添加【@Async】注解,需要指定实例名为上一步创建的Bean名称,此处用延迟一秒钟模拟处理数据耗时。

4、测试多线程效果
此处为大家演示使用Controller接口触发异步任务,用5次循环模拟同时五个请求,根据控制台输出,查看是否多线程执行。

控制台会输出5个任务,执行线程名称不同,说明这些任务是多线程并发执行的,所以Spring可以通过简单配置,实现多线程。如果我们不添加@EnableAsync和@Async注解,这些任务会按顺序执行。

二、Spring Batch多线程和chunk的关系
Spring Batch是Spring用来处理“大量数据”的框架,例如批量导入、生成报表等。很多人不理解多线程和chunk的关系。我们可以用一个通俗的比喻:处理10万条数据,相当于搬10万块砖,chunk就是“每次搬10块砖”,多线程就是“多个人同时搬砖”,二者配合,既能提高效率,又能避免出错,下面我就详细为大家介绍一下二者的关系。
什么是chunk呢?在Spring Batch中,这是批处理的最小数据单位,就是把大批量数据,分成一个个小的“数据块”,每次只处理一个块,处理完一个块,再处理下一个。每个Chunk的执行,都有一个事务,要么这个块的所有数据都处理成功,要么都失败,不会出现“部分成功、部分失败”的情况,例如下图所示,chunk的参数是10,就是每次处理10条数据。

Spring Batch多线程是什么?Spring Batch的多线程,核心是“多个人同时处理不同的Chunk”,比如我们有10万条数据,chunk的参数是1000,就分成100个Chunk,用5个线程同时处理,每个线程处理20个Chunk,这样比单线程处理100个Chunk快很多。指定多线程的方式非常简单,只需要指定Batch的taskExecutor参数,并传入线程池即可。

三、总结
以上就是Spring是多线程还是单线程,Spring Batch多线程和chunk的关系的相关内容。Spring创建Bean时默认以单线程的方式创建,在实际业务场景上,如果要用多线程的方式提高效率,可以参考上文使用【@Async】注解开启多线程。本文还为大家介绍了Spring Batch多线程和Chunk参数的关系,希望对你有所帮助。