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



推荐阅读
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 2019我的金三银四
    先讲一下自己的情况吧,二本学生,17年毕业,目前在一家跨境电商从事Java技术开发工作(不是阿里,没那么厉害),技术栈目前偏向于容器云、持续集成持续交付这一块,也就是SpringBoot、Kuber ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 安装goget-ugithub.comgomoduleedigoedis连接var(redisHost127.0.0.1:6379redisPassroot)创建redis ... [详细]
  • 详解Netty Zero Copy机制
    NettyZeroCopy的巧妙设计让Netty从众多高性 ... [详细]
  • Java开发面试问题,2021网易Java高级面试题及答案,实战案例
    前言大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历 ... [详细]
  • kafka教程基本概念
    kafka教程基本概念 ... [详细]
  • 大家好,这是一个为了梦想而保持学习的博客。这个专题会记录我对于KAFKA的学习和实战经验,希望对大家有所帮助,目录形式依旧为问答的方式,相当于是模拟面试。一、概述在对kafka有了 ... [详细]
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社区 版权所有