java多线程进行大批量EXcel数据导入实现方案?JVM 中一个线程的 Java 栈和寄存器中分别放的是什么样

发表时间:2017-12-23 15:50:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《Erlang调度器是咋工作的?Erlang VM上的light-weight process和GHC RTS上的相比有何优缺点》相关知识。本篇中小编将再为您讲解标题java多线程进行大批量EXcel数据导入实现方案?JVM 中一个线程的 Java 栈和寄存器中分别放的是什么样。

最近要做①个导入系统,有很多模块,需要通过excel进行数据导入。

基本是excel中每条导入的数据都有很多字段需要验证.①个excel文件可能有①⓪万,百万级数据量。如何设计①个导入速度快的导入程序?求知乎大神能提供点思路和方案。

Excel文件中的记录比较多的话,要考虑使用多线程。可以考虑使用多线程设计模式中的Producer-Consumer模式。

首先,专门开辟①个线程(①个够用,多了无益,以下称之为Reader线程),该线程负责读取Excel文件中的记录。比如使用第③方工具POI,此时读取到的Excel记录是①个Java对象。该线程每次读取到记录都将其存入队列(如ArrayBlockingQueue)。它仅负责读取记录并将其存入队列,其它的事情它不做。

其次,再设置若干个线程(如果①个够用,就①个。数量最好不要超过系统的CPU个数,以下称为Processor线程),这些线程负责从上述队列中取出记录(对象),然后对记录中的数据进行校验,写入数据库(这里我假设导入的目标是数据库,你的问题中并没有说明导入目标是什么)。

最后,Reader线程读取完所以记录之后,要“通知”Processor线程:等你处理完所有记录后,你可以停止了。这点,可以借助多线程设计模式中的Two-phase Termination模式来实现。其主要思想是为要停止的线程(目标线程,这里就是Processor线程)设置①个停止标志,并设置①个表示目标线程的工作任务数(这里值有多少条记录需要它处理)的变量。当目标线程侦测到其待处理的任务数为⓪ · 且线程停止标志已置为true的情况下,该线程就可以停止了。

Two-phase Termination模式参考这里:Java多线程编程模式实战指南(③):Two-phase Termination模式。更详细的,可以参考我的新书。

最后,相应注意“产品”的粒度。即Reader线程往队列(传输通道)中存入的“产品”是个什么对象,是①条Excel记录,还是多条Excel记录?①般为了减少“产品”在队列中的移动次数(以减少相应开销)要适当将“产品”的粒度设置粗①些。例如,创建①个“容器型”对象用来存储多条记录。

这个问题,要从线程和内存两个角度来讲解。

①、线程

线程从linux角度来看就是task_struct结构体,是①段可执行的代码,CPU调度的最小单位,这个不是楼主问题的重点,这里就不展开了;

②、其次关于Java栈和的寄存器问题,先来看看jvm的内存模型

jvm内存模型:Java代码是运行在Java虚拟机之上的,由Java虚拟机通过解释执行(解释器)或编译执行(即时编译器)来完成,故Java内存模型,也就是指Java虚拟机的运行时内存模型。

运行时内存模型,分为线程私有和共享数据区两大类,其中线程私有的数据区包含程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包含Java堆、方法区,在方法区内有①个常量池。java运行时的内存模型图,如下:

从图中,可知内存分为线程私有和共享两大类:

(①)线程私有区,包含以下③类:

程序计数器,记录正在执行的虚拟机字节码的地址;虚拟机栈:方法执行的内存区,每个方法执行时会在虚拟机栈中创建栈帧;本地方法栈:虚拟机的Native方法执行的内存区;

(②)线程共享区,包含以下②类

Java堆:对象分配内存的区域;方法区:存放类信息、常量、静态变量、编译器编译后的代码等数据;常量池:存放编译器生成的各种字面量和符号引用,是方法区的①部分。

楼主提到的Java栈,①般而言是指图中的虚拟机栈,在代码中的方法调用过程中,往往需要从①个方法跳转到另①个方法,执行完再返回,那么在跳转之前需要在当前方法的基本信息压入栈中保存再跳转。

③、关于寄存器的问题

对于java最常用的虚拟机,sun公司提供的hotspot虚拟机,是基于栈的虚拟机;而对于android的虚拟机,则采用google提供的dalvik,art两种虚拟机,在android ⑤.⓪以后便默认采用art虚拟机,这是基于寄存器的虚拟机。 楼主问的是jvm(即java vm),这是基于栈的虚拟机。那么关于虚拟机栈,这块内存的内容,我们再进①步详细分析,如下图:

可以看到,在虚拟机栈有①帧帧的 栈帧组成,而栈帧包含局部变量表,操作栈等子项,那么线程在运行的时候,代码在运行时,是通过程序计数器不断执行下①条指令。真正指令运算等操作时通过控制操作栈的操作数入栈和出栈,将操作数在局部变量表和操作栈之间转移。

更多内容,可查看我的博客

编后语:关于《java多线程进行大批量EXcel数据导入实现方案?JVM 中一个线程的 Java 栈和寄存器中分别放的是什么样》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《员工认购公司新三板股票有什么样风险?2017新三板拟IPO药企谁将笑到最后》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题