热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

new无法执行@Autowired注解,多线程注意事项和如何判断子线程是否全部执行完成

前言最近一段时间在整公司项目里一个功能的优化,用到了多线程处理。期间也是踩了不少的坑,在这里想说下我遇到的问题和注意事项。以及怎样知道启动的那些多线程都

前言

最近一段时间在整公司项目里一个功能的优化,用到了多线程处理。期间也是踩了不少的坑,在这里想说下我遇到的问题和注意事项。以及怎样知道启动的那些多线程都处理完毕这些问题。

实现Runnable接口类需要注意事项

我这里用的多线程,是用了实现Runnable接口,这样的话,要比继承Thread类更加的灵活。毕竟类只能单继承,但可以多实现。

1.事务失效

我实现Runnable接口的类,是处理业务的handler类,在spring配置里面是默认给这些类添加事务的。所以我当时直接在这个类里面写了业务代码。到测试的时候发现,如果业务方法里报Runtime异常,这个类里面的一些更新方法居然不回滚,直接提交了。

当时也是试了很多方法,手动给这个类加事务的注解、开辟新事物,都不行。后来查阅资料,发现在Runnable实现类里,是不支持事务的。那我就新写了一个类,把主要的业务方法全放到那个类里,再测试,发现事务可以正常回滚了。

2.注解无效

在实现Runnable接口的类里,本来想用spring提供的@Autowired注解来自动注入类呢,发现在run方法里,调用注入的类,报空指针。后来明白,实现Runnable接口的类不受spring监管,所以spring的一些注解就不能使用了。

解决办法:

1.可以参考下面这样写,可以获得你想要用的类。

ApplicationContext ctx = new ApplicationContext();

ctx.getBean(你想要获取的类名.class);

2.那就是在调用多线程实现类之前,在其他类里用spring的一些注解,获得你想要的类,然后通过参数方式,传到多线程实现类里面。(我是采用的这个方式。)

如何知道多个线程都执行完毕了呢?

使用多线程,主要就是为了提高程序的运行效率。一般情况下,分配完线程,让那些线程去执行就行了,也不需要关心他们都什么时候执行完毕了。但是有些情况下,知晓那些线程都什么时候执行完毕,确实很有用。

我实现的那个功能就是放在定时器里面的,知晓定时器什么时候开始,什么时候执行完毕,在完毕的时候执行一些发邮件的一些功能,是很有用的。如果是单线程,那就直接把那些方法日志啥的放到最后执行就可以了。

但是开辟了多个线程,往往是多线程还在执行,主线程不等那些子线程,就先自己执行完了,这时候,放到最后执行的那些功能就不行了,因为子线程还没执行完,主线程就把最后的那些“收尾”功能给执行了,肯定不合适。

thread.Join方法,可以让交替执行的线程变成顺序的执行,但这样跟单线程就没啥区别了。

后来,我想了一个办法。代码如下:

//线程池

private ExecutorService threadPool;

//分配线程任务

for (int i&#61;0; i<5; i&#43;&#43;) {

threadPool.execute(new RunHandler());

}

//关闭线程池&#xff0c;此时执行的线程不会立刻关闭&#xff0c;而是线程池不再接受新的线程请求了&#xff0c;线程执行完会被回收掉。

threadPool.shutdown();

while(true){

if(threadPool.isTerminated()) {//判断线程是否执行完毕&#xff0c;不是就休眠主线程。

//如果子线程们都执行完毕&#xff0c;就会进这个判断&#xff0c;然后会跳出这个循环。这样就达到了主线程等待子线程们

//都执行完了&#xff0c;才去执行其他的代码。

break;

}

Thread.sleep(1000);//主线程睡眠1秒

}

//这里写执行完毕的日志或者最后的“收尾”功能。

这个就是我目前使用的方法。当然&#xff0c;能实现这个功能的方法还有很多&#xff0c;我选的也是比较好实现容易理解&#xff0c;效率算是比较高的一种吧。

最后

以上就是我发现和解决的一些常见的问题。由于能力有限&#xff0c;如有错误&#xff0c;敬请谅解。

写好一个多线程的功能&#xff0c;以上那些注意事项往往根本不够。最主要的是解决多线程之间的冲突&#xff0c;如何避免多线程操作导致变量数据的错乱和引发的数据库保存数据的异常等问题。这些是值得推敲和反复琢磨的&#xff0c;加锁一般能解决这些问题&#xff0c;但是不合理的加锁和使用的加锁方式的不同&#xff0c;可能会导致多线程执行起来的效率不尽人意。

欢迎工作一到五年的Java工程师朋友们加入Java程序员开发&#xff1a; 721575865

群内提供免费的Java架构学习资料&#xff08;里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码&#xff0c;MyBatis&#xff0c;Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料&#xff09;合理利用自己每一分每一秒的时间来学习提升自己&#xff0c;不要再用"没有时间“来掩饰自己思想上的懒惰&#xff01;趁年轻&#xff0c;使劲拼&#xff0c;给未来的自己一个交代&#xff01;



推荐阅读
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 美团优选推荐系统架构师 L7/L8:算法与工程深度融合 ... [详细]
  • Java 点餐系统源代码附带管理后台(免费提供)
    本项目提供了一套基于 Java 的点餐系统,包括前端小程序和后端管理平台。采用 Spring Boot 和 SSM 框架,结合 MySQL 和 Redis 数据库技术,适用于学习和二次开发。有需要源代码的开发者可以通过私信联系,免费获取下载链接。 ... [详细]
  • 在C语言中,定义一个包含学号、姓名和年龄的学生信息结构体,并遵循严格的命名规范。首先,初始化结构体变量的所有成员为默认值,然后将其学号设为88,姓名设为“liming”,年龄设为25。最后,在控制台上输出该结构体变量的详细信息,以验证数据的正确性。例如,使用 `typedef struct Student` 定义结构体类型。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • 在日常的项目开发中,测试环境和生产环境通常采用HTTP协议访问服务。然而,从浏览器的角度来看,这种访问方式会被标记为不安全。为了提升安全性,当前大多数生产环境已经转向了HTTPS协议。本文将详细介绍如何在Spring Boot应用中配置SSL证书,以实现HTTPS安全访问。通过这一过程,不仅可以增强数据传输的安全性,还能提高用户对系统的信任度。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • Jeecg开源社区正式启动第12届架构技术培训班,现已开放报名。本次培训采用师徒制模式,深入探讨Java架构技术。类似于大学导师指导研究生的方式,特别适合在职人员。导师将为学员布置课题,提供丰富的视频资料,并进行一对一指导,帮助学员高效学习和完成任务。我们的教学方法注重实践与理论结合,旨在培养学员的综合技术能力。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
author-avatar
CleanTheString
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有