该线程占用cpu时间长,并且占用内存多。run方法哪地方需要优化,请大侠们指教,坐等回答...
下面是线程的run方法,该方法的作用是检查数据库中有没有未处理的事件,如果有,就处理。
while条件一直是true
commonService.basicQuery()方法是来查询数据库
catch中的doPauseThread()方法是让该线程睡5秒
public void run() { String err = "Error occurred in FlightEventThread, Administrated"; while (isThreadAlive) { try { List<FlightEvent> allEvent = commonService.basicQuery( FlightEvent.class, (Object) exampleEvent, true, "eventId"); for (FlightEvent event : allEvent) { event.setIsProcessed("P"); commonService.basicUpdate(event); IEventProcessor eventProcessor = (IEventProcessor) Global.applicationContext .getBean(event.getEventProcess().getProcessBean()); eventProcessor.setEvent(event); try { eventProcessor.execute(); eventProcessor.doSendMessageToFront(); } catch (IllegalDataException ie) { log.error(err, ie); } catch (Exception e) { log.error(err, e); } } /* Sleep is not needed disable by hwlcsx */ /*doPauseThread();*/ } catch (Exception e) { log.error(err, e); } finally{ doPauseThread(); } } }
通过注释掉,运行,看内存,找到最有影响的代码,再处理。
这个代码写的不太好,因为你在循环里面执行了 commonService.basicUpdate(event);
你应该考虑优化的你的处理逻辑。
如果是这段代码影响性能了,显然是对数据库的操作的问题。
1、看看commonService.basicQuery查询方法怎么实现的,不合理的查询会很慢;
2、不应该一条一条的执行commonService.basicUpdate
至于内存太大,看看是不是每次查询的时候生成的对象太多了,因为你的while条件一直是true,就会一直生成。。。
占用内存多,是你包装run方法的那个类的成员变量太多或者是线程中你不断地在新建对象。如果是占用cpu多,就让它sleep吧。