热门标签 | 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;



推荐阅读
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文总结了Java程序设计第一周的学习内容,涵盖语言基础、编译解释过程及基本数据类型等核心知识点。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • andr ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
  • 本文详细介绍了 Java 中的 org.apache.hadoop.registry.client.impl.zk.ZKPathDumper 类,提供了丰富的代码示例和使用指南。通过这些示例,读者可以更好地理解如何在实际项目中利用 ZKPathDumper 类进行注册表树的转储操作。 ... [详细]
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社区 版权所有