在上一篇文章中,小编为您详细介绍了关于《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药企谁将笑到最后》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器