问个关于java多线程的问题

loveghl 2011-08-14 09:57:06
大家好,我现在有个非常简单的程序,但是有一些疑问想请大家帮忙解释一下,非常感谢!
我的问题是:现在我有256个独立的文件,我要分别读取每个文件,解析文件的内容并存到hashtable里,然后查询hashtable把其中一些entry给写到文件里。当用单线程串行的做这个工作时,需要1200秒,现在我把它改成了8个线程同时去做这个工作,按理说应该快8倍,但是实际上只把时间缩短到了800秒,我track了一下发现虽然hashtable需要占用较多的内存,但是机器的内存绝对够用(机器有8个物理核,96GB内存),所以想请教下大家这是什么原因呢?各个文件都是不相关的。
...全文
55 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
火光闪耀 2011-08-14
  • 打赏
  • 举报
回复
是啊,有关IO的,多线程不可能想人们相信的那样快几倍。
  • 打赏
  • 举报
回复
你用多线程处理文件,最多只能力节省一下文件读取后处理的时间,至于在文件读取上不会有任何速度的提高。

如果稍微了解一下数据在磁盘上是如何读取的,我想应该就能想明白。
  • 打赏
  • 举报
回复
IO 操作的并发能力为 0,因为磁盘的磁头只有 1 个,不要想当然地在 IO 上使用多线程操作!
loveghl 2011-08-14
  • 打赏
  • 举报
回复
我多线程用在处理256个文件中,因为各个文件大小不同且大小差异较大,我并没有采用均分让每个线程处理32个文件,而是我在最开始设置了一个256位的BitSet,然后每个线程接受一个0到255之间的random int number,看下在BitSet中对应的bit位是否为true,是的话就重新生成random number,直到对应bit位为false,然后该线程去处理文件编号位对应random number的文件:解析文件,填入hashtable,写出所需entry,clear hashtable;处理完毕后去pickup下一个未被处理的文件,直到所有256个文件都被处理完了程序终止。每个线程维护独立的hashtable,没有共享hashtable,整个过程中被共享的只有那个BitSet,另外我确实采用的是hashmap,谢谢!
Fly_m 2011-08-14
  • 打赏
  • 举报
回复
你多线程在哪个 地方处理的?处理256个文件中吗?还是在处理hashtable时使用多线程。

如果这256个文件都是相互独立的,且在处理时没有干扰,那么在开始就使用多线程,将256 / 8分成每个线程处理32个文件,分别放到相对应的8个hashtable中,再进行处理。

如果在处理hashtable时,没有线程同步,那么请使用hashmap。

不知道你的线程同步的条件在哪儿,哪个地方需要线程同步。如果没有线程同步,就按照上面的做。
jingluo 2011-08-14
  • 打赏
  • 举报
回复
建议楼主把各个耗时打出来,看瓶颈是不是在IO上。如果是IO占绝对大头,那你这多线程作用不大
得想办法提高磁盘的速度

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧