springboot2.0版本 执行多线程方式,个人学习了两种,一种直接是继承父类Thread或实现Runnable 接口类,,重写run方法;第二种是通过springboot的支持注解@Async的方式。

第一种:自定义类继承Thread类或继承Runnnable接口,重写run方法

import com.xxx.xx.taskphone.model.PhoneCallin;
import com.xxx.xxx.taskphone.service.PhoneCallinService;public class PhoneCallInThread implements Runnable{private PhoneCallinService phoneCallinService;public PhoneCallInThread(PhoneCallinService phoneCallinService) {super();this.phoneCallinService = phoneCallinService;}@Overridepublic void run() {System.out.println("-------------------");//phoneCallinService.test();自定义逻辑业务}}

开启线程

@Component
public class TaskScheduling {@Autowiredprivate PhoneCallinService phoneCallinService;@Scheduled(fixedRate = 2000)public void savePhoneCallin(){long size = 5;if(size>0){new Thread(new PhoneCallInThread(phoneCallinService)).start();}}}

注:因为线程处理是执行逻辑的,所以spring无法通过注解的形式来说完成代理的类对象(如此处的phoneCallInService);但是可以通过获取ApplicationSpringContext上下文来获取代理对象。

我这里用的定时任务@scheduled(fixedRate = 2000) 每隔2秒钟执行一次。

第二种:springboot2.0使用@Async进行异步调用

多线程的配置类

package com.xxx.perform.config;import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
public class TaskPoolConfig {@Bean("taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10);//核心线程数目executor.setMaxPoolSize(20);//指定最大线程数executor.setQueueCapacity(200);//队列中最大的数目executor.setKeepAliveSeconds(60);//线程空闲后的最大存活时间executor.setThreadNamePrefix("taskExecutor-");//线程名称前缀executor.setWaitForTasksToCompleteOnShutdown(true);//设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean,确保 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。executor.setAwaitTerminationSeconds(60);//设置线程池中 任务的等待时间executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}

启动类上开启线程支持

@EnableAsync
public class PerformAdminApplication {public static void main(String[] args) {SpringApplication.run(AdminApplication.class, args);}
}

使用@Async注解表明当前类或当前方是一个线程类,并支持多线程处理

@Scheduled(fixedRate = 2000)
@Async
public void test(){System.out.println("---------");
}

需要注意的事,如果多次调用被@Async注解的方法,会每次都会生成一个线程来处理方法逻辑。这样就需要及时处理逻辑后的结果。需要提供方法的返回处理逻辑。

多线程的异步回调

在被注明是线程处理的方法提供回调信息类

@Async
public Future<String> doTaskCallback() throws Exception {super.doTaskTwo();return new AsyncResult<>("任务二完成");
}

然后直接正常获取返回值就可以了

List<String> result = new Test().doTaskCallback();

最后个人建议在执行下一次的调用之前先判断当前线程是否已经完成,result.isDone()。如果线程未结束,可以Thead.sleep(1000),休眠一定时间后重新执行。

springboot2.0 多线程并发执行任务相关推荐

  1. java中thread实例_Java多线程并发执行demo代码实例

    主类:MultiThread,执行并发类 package java8test; import java.util.ArrayList; import java.util.List; import ja ...

  2. 多线程并发执行及解决方法

    用一个案例来说明:假如我们要实现一个售票的小功能,用3个线程售出共2000张票. 初始模型为: package com.test7;public class synchronizedTest {pub ...

  3. Java Script 多线程并发执行与异步执行浅析

    众所周知,JS是单线程运行机制,但是当我们在使用AJAX请求时会有async选项,来实现异步. 那么小编今天来简单的说一下关于JS的异步到底是怎么实现的. 我们先测试这样一段代码: self.setI ...

  4. hutool实现多线程并发执行并等待的功能

    package com.system;import cn.hutool.core.thread.ThreadUtil; import lombok.SneakyThrows;import java.u ...

  5. c++多线程并发执行

    算是学到的一个重要知识 C++:线程(std::thread) C++11并发之std::thread 语音识别中,声源定位线程所需时间很短.在一次while循环中,在声源定位线程得到角度并赋值给全局 ...

  6. 4.0 多线程基础篇

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 "简书" 4.0-1.1 进程 概念 : 进程是指在系统中正在运行的一个应用程序 ...

  7. Java-多线程-Future、FutureTask、CompletionService、CompletableFuture解决多线程并发中归集问题的效率对比

    转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: [小家Java]Future.FutureTask.CompletionService.CompletableFut ...

  8. 多线程并发可能遇到的问题及Runable和Thread之间的关系

    一.多线程并发可能遇到的问题 多线程并发执行可能会导致一些问题: 安全性问题:在单线程系统上正常运行的代码,在多线程环境中可能会出现意料之外的结果. 活跃性问题:不正确的加锁.解锁方式可能会导致死锁或 ...

  9. python主线程执行_python 并发执行之多线程

    正常情况下,我们在启动一个程序的时候.这个程序会先启动一个进程,启动之后这个进程会拉起来一个线程.这个线程再去处理事务.也就是说真正干活的是线程,进程这玩意只负责向系统要内存,要资源但是进程自己是不干 ...

最新文章

  1. 虚拟机无法上网/连接失败原因及解决方法
  2. python程序实例电话本-Python示例
  3. 算法提高课-搜索-最短路模型-AcWing 1100. 抓住那头牛:bfs
  4. Windows下编译axel 2.6 / 2.11(下载神器)
  5. asp.net core 系列之Startup
  6. 7-8 数字三角形 (31 分)(思路+详解+动态规划)Come Baby!!!!!!!!!!!
  7. 博客诞生过程与变革:十年来谁是写博客第一人?
  8. 苹果软件App上架问题
  9. JavaScript验证表单大全【自用】
  10. 从360和QQ打架看客户端的高精尖武器技术发展:自己留着,防止忘记!
  11. 淘宝/天猫API接口详情介绍(B类高级接口)
  12. win10 自带wi-fi热点速度太慢怎么办_win10wifi热点速度极慢如何解决
  13. [渝粤教育] 云南大学 大学生心理健康教育 参考 资料
  14. 【免填邀请码】让邀请裂变活动事半功倍
  15. 欧拉函数与积性函数(互质数)
  16. vue valley_12个无剧透的Stardew Valley秘诀和技巧,助您入门
  17. 纪念三毛辞世20周年——《三毛经典语录》
  18. 前端开发入门 --摘自慕克网大漠穷秋
  19. 在Python中使用HTML模版的教程
  20. Win10/Win11下清除windows defender安全中心病毒和威胁防护历史记录

热门文章

  1. 库位管理html,库位管理.html
  2. 2016 校招, Android 开发,一个本科应届的坎坷求职之路(转)
  3. 同步时分复用和异步时分复用
  4. c语言源代码_你想要的源代码来啦!C语言实现通讯录管理系统!
  5. Parcelable
  6. 通常把计算机网络定义为什么?,通常把计算机网络定义为什么
  7. PVST的简单应用及其配置
  8. Unity VR:关于如何捕捉VR手柄按键
  9. Docker精华问答 | Docker commit如何用?
  10. PLC的扫描工作的三个过程