为了提高效率,我用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%运转的电脑,是很卡的,基本上什么也干不了……)。所以,以后吧。(嗯,拖延的借口越编越真实了)