`
61234865
  • 浏览: 11428 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于会阻塞spring初始化线程对象的处理

阅读更多

需求前提:在容器加载的过程中,需要要同时加载某些特殊的会阻塞线程的对象,例如(自动启动msn并自动登陆)。

 问题描述:由于spring的初始化过程是单线程进行的,这种特殊的对象会导致线程阻塞,spring无法进行正常初始化。

  解决方案:

1.使用监听器。

2.延时加载。

3.二次加载。

方案分析:

第一种方案:此方法使用单独的线程来启动这类资源,因此不会影响到spring自身的初始化。问题在于,一般在业务需求中,我会都会需要通过


spring从DB中获取数据后再启动这类对象,例如(msn的email和密码都存于DB中)。而这里的listener线程和spring的初始化线程是同时进行的,因此,spring


未初始化之前是无法获取DB中资源的。并用此类listener貌似无法被spring托管

第二种方案:此方法的思路是在spring初始化的过程中,不进行特殊对象的初始化。等spring初始化完毕,各种资源都就绪后,再进行特殊对象的初


始化。问题:1.无法自动加载。2.手动初始化用户进程也会被阻塞

第三种方案:三spring加载完毕后,进行再次初始化,这个可以在springloadlistendr里去做二次初始化(注:用多线程去做,此时spring已经初始


化完毕,所有资源都可以正常获取),这样即可保证spring正常初始化,也可以保证所有特殊对象正常初始化。


需求问题分析:

以前一直以为,这种特殊的对象spring会启动新线程来处理,后来深入了解spring后发现,其实spring并没有对这种对象特殊对待。因为为了保证初


始化的完整性,这种对象是必需要启动新线程来初始化的。而spring则是单线程解决一些依赖关系后按顺序初始化的。之所以对spring产生错误的理解,认为


它会处理这种对象,是因为在平时使用过程中,遇到过一些会阻塞线程的对象,但spring并没有被阻塞。例如说TimerFactoryBean定时器,在spring里配置后


并没有阻塞。今天仔细看了一下这个类调用的过程,结果发现原来这个类在调用过程中自己进行了线程处理,因此不会阻塞spring的初始化线程了。

总结:

对于一些不理解的东西,最好先去猜测它实现,然后看看源代码来验证猜测的正确性。对于spring源代码的分析,不难发现,所有会阻塞线程的对象


,都需要用户自己去处理使得它不会阻塞,spring是不负责进行这些检测的。因为对spring而言,它也不知道哪些对象需要特殊处理。即使知道,它启动新线


程来处理这些对象的时候,也无法保证所有的依赖对象都正确初始化。注:上面所说的特殊对象的初始化,并不是指实例的生成,而是指实例生成后对会阻塞


线程的方法的调用。

 

分享到:
评论

相关推荐

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    类什么时候才被初始化: 58 类的初始化步骤: 59 【*JVM】什么是JVM线程死锁?JVM线程死锁,你该如何判断是因为什么?如果用VisualVM,dump线程信息出来,会有哪些信息? 59 【*JVM】查看jvm虚拟机里面堆、线程的...

    Java并发编程原理与实战

    线程的初始化,中断以及其源码讲解.mp4 多种创建线程的方式案例演示(一)带返回值的方式.mp4 多种创建线程的方式案例演示(二)使用线程池.mp4 Spring对并发的支持:Spring的异步任务.mp4 使用jdk8提供的lambda进行...

    javaSE代码实例

    5.3.2 利用循环初始化 64 5.3.3 枚举初始化 66 5.4 数组的相互赋值 67 5.4.1 基本类型数组赋值规则 67 5.4.2 引用型数组赋值规则 68 5.5 数组的常用操作 69 5.5.1 数组复制 69 5.5.2 数组排序 71 ...

    龙果 java并发编程原理实战

    第6节线程的初始化,中断以及其源码讲解00:21:26分钟 | 第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发...

    Java 并发编程原理与实战视频

    第6节线程的初始化,中断以及其源码讲解00:21:26分钟 | 第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发...

    龙果java并发编程完整视频

    第6节线程的初始化,中断以及其源码讲解00:21:26分钟 | 第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发...

    java并发编程

    第6节线程的初始化,中断以及其源码讲解00:21:26分钟 | 第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 | 第9节Spring对并发...

    JAVA上百实例源码以及开源项目

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目源代码

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    Java学习笔记-个人整理的

    {1.10.2}数组变量的初始化}{34}{subsection.1.10.2} {1.10.3}数组对象的引用}{35}{subsection.1.10.3} {1.10.4}数组对象的复制}{35}{subsection.1.10.4} {1.10.5}扩充数组对象长度}{36}{subsection.1.10.5} {...

    JAVA核心知识点整理(有效)

    2.1. 线程 ...................................................................................................................................................... 20 2.2. JVM 内存区域 .....................

Global site tag (gtag.js) - Google Analytics