盗賊の極意

Feed Rss

【未解决】神出鬼没的多线程bug

09.27.2012, 未分类, by , 2,192 views.

为了提高效率,我用java自带的线程池ThreadPoolExecutor把一个研究工具的处理过程做成了多线程,在研究室的四核cpu8G内存的电脑上跑效果拔群。只是,时不时的会出现cpu使用率为0的卡死现象,很难触发,无法重现,目测为多线程bug。(多线程新手一个,目测也没什么依据^_^b)

我觉得,如果是我的程序死循环了,cpu应该100%的,但是没有。

程序我设了超时后改变控制循环的bool型flag,应该是可以确保线程退出的,但是卡住了。

往线程池里填完任务以后,等待任务完成的代码是这样的:

ThreadPoolExecutor executor = new ThreadPoolExecutor(...)

...

executor.shutdown();

executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

我觉得吧,应该是程序在await这里永远的等下去了。所以才会没有反应也不占cpu。

因为问题难以重现,我也想不出来应该在哪里设断点……Orz

所以,这个【未解决】恐怕要挂很久了。

要命的是,这个程序事关一个评测(比赛),时限4天。我初步计划花38小时无人值守让程序自己跑的。现在出了这个bug,我就只能时不时起来看看它,死了得关掉重开。不仅麻烦而且浪费宝贵的时间,真是……恨自己学艺不精啊!当年小勤同志告诉我,java学到后面是XXX,再后面是XXX,在后面是XXX,在后面是多线程。果然是很后面的技术,平时根本用不到,没经验。真正用起来了出了错难以调试,难学难提升。 不过,挺有趣的^_^

明天将(基本上)决定我是不是需要多浪费一年生命找工作,我得去琢磨我的面试草稿了。这个程序题很有挑战,但我没空,时间不合适,也没有很好的条件去解决这个问题(4核全100%运转的电脑,是很卡的,基本上什么也干不了……)。所以,以后吧。(嗯,拖延的借口越编越真实了)

executor.shutdown();

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>