本文目录一览:

springboot多任务并行+线程池处理+等待获取执行结果

在日常的开发项目过程中,时常会有多线程的使用场景。最近开发的需求中也是如此,只不过这次需要开启多线程去执行,要等所有线程结束统一获取结果。所以在此整理一下,我们目前用的是方法二。

springboot多线程(SpringBoot多线程项目)springboot多线程(SpringBoot多线程项目)


springboot多线程(SpringBoot多线程项目)


启动类添加@EnableAsync注解

serv层方法

参考:

SpringBoot线程池ThreadPoolExecutor

SpringBoot线程池ThreadPoolTaskExecutor

Spring Boot使用@Schedule启动、停止服务

在spring boot项目的Application类中增加@EnableScheng注释,创建bean组件(Component),并使用@Scheduled(cron= "0 0/20 ?")

1、这种方式基本就是全局开启了该定时任务,如果直接将任务内容写在其中,那么很难对定时任务的开关进行控制。

2、服务中的异常也无法使用全局异常捕获的方式进行处理。

3、这种定时任务为单线程方式

1、将服务定义成Serv,使用Controller调用Serv服务,在定时任务中通过RestTemplate访问本地的Controller地址。这解决了全局异常捕获的问题。

2、在配置文件中定义定时任务是否启动的配置项,Schedule中先判断该参数是否为启动。设默认配置为启动状态,需要对定时任务进行关闭,那么可以在Controller定义一个接口,用来将该参数设置为停止状态。这解决了定时任务的启动与停止切换问题。

3、将其改造为多线程,一般使用线程池,百度上N多案例,不在此介绍

一图看懂Spring Boot 异步框架

在SpringBoot的日常开发中,一般都是同步调用的。但经常有特殊业务需要做异步来处理,例如:注册新用户,送100个积分,或下单成功,发送push消息等等。

就拿注册新用户为什么要异步处理?

在SpringBoot中使用异步调用是很简单的,只需要使用@Async注解即可实现方法的异步调用。

采用@EnableAsync来开启异步任务支持,另外需要加入@Configuration来把当前类加入springIOC容器中。

增加一个serv类,用来做积分处理。

@Async添加在方法上,代表该方法为异步处理。

@Async注解,在默认情况下用的是SimpleAsyncTaskExecutor线程池,该线程池不是真正意义上的线程池,因为线程不重用,每次调用都会新建一条线程。

可以通过控制台日志输出查看,每次打印的线程名都是[task-1]、[task-2]、[task-3]、[task-4].....递增的。

@Async注解异步框架提供多种线程

SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。

SyncTaskExecutor:这个类没有实现异步调用,只是一个同步作。只适用于不需要多线程的地方。

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

ThreadPoolTaskScheduler:可以使用cron表达式。

ThreadPoolTaskExecutor :最常使用,。 其实质是对ja.util.concurrent.ThreadPoolExecutor的包装。

SpringBoot多线程如何捕捉子线程异常

最近因为别的需求,写了一个模块,似乎在这里能用得上:

其中的 example.py :

#!/usr/bin/env python# coding = utf-8 """example""" __author__ = 'Rnd495' from time import sleepfrom ChatProcess import Chatroom class Echo(Chatroom): """ Echo """ def response(self, data): if data.startswith('sleep'): sec = float(data[6:]) sleep(sec) return 'wake up after %dms' % (sec 1000) elif data: return data else: self.stop() return 'goodbye' if __name__ == '__main__': from ChatProcess import TimeoutError, ProcessError print 'process 01:' e = Echo.create_process(lifetime=1).start() print e.chat('Hello world!'), e.remain print e.chat('sleep:0.1'), e.remain print e.chat(''), e.remain print '' print 'process 02:' e = Echo.create_process(lifetime=1).start() try: print e.chat('Hello world!'), e.remain print e.chat('sleep:1.0'), e.remain print e.chat(''), e.remain except TimeoutError, error: print 'error:', error print '' print 'process 03:' e = Echo.create_process(lifetime=1).start() try: print e.chat('Hello world!'), e.remain print e.chat('sleep:not a num'), e.remain print e.chat(''), e.remain except ProcessError, error: print 'error:', error

运行结果为:

process 01:Hello world! 0.773000001907wake up after 100ms 0.549000024796goodbye 0.547000169754 process 02:Hello world! 0.868000030518error: TimeoutError process 03:Hello world! 0.868000030518error: ('Error occurred on loop', ValueError('could not convert string to float: not a num',))

在其中的 process01 中,主进程捕获了 超时

在其中的 process02 中,主进程捕获了 子进程的错误

不知道你能不能用得上

springboot是多线程的吗

只能说springboot支持多线程,其实在spring的所有项目中很少见过多线程处理。因为我们在使用spring开发web项目的时候,action(controller),serv,dao类的作用域都是单实例的。

SpringBoot多线程并发定时任务

刚刚看了下Spring Boot实现定时任务的文章,感觉还不错。Spring Boot 使用Spring自带的Schedule来实现定时任务变得非常简单和方便。在这里个大家分享下。

启动项目,查看控制台打印信息,发现定时任务已经生效。spring boot 和Scheduled整合完毕。

但是后来发现个问题,通过同时测试几个任务发现,所有的任务都是在同一个线程池中的同一个线程来完成的。在实际开发过程中,我们当然不希望所有的任务都运行在一个线程中。

那么,怎么设计成多线程实现并发呢?在网上看到过这样的解决方案。通过ScheduleConfig配置文件实现SchengConfigurer接口,并重写setScheduleng方法,我们尝试着配置了一下。

这样就完成了多线程并发的配置?我们启动项目通过控制台输出信息验证一下结果,发现所有的任务都在同一个线程池但不同线程中完成,说明这个方案完全可行,这样,我们就完成了spring boot 多线程并发定时任务。

其实不会Cron表达式也不用担心,网上有好多在线Cron生成器,我们完全可以通过在线生成器生成符合要求的cron,也很方便。