java.lang.Thread.State: BLOCKED (on object monitor)
at java.util.logging.StreamHandler.publish(StreamHandler.java:206)
- waiting to lock <0x00000000c1abfdd0> (a java.util.logging.ConsoleHandler)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:116)
at java.util.logging.Logger.log(Logger.java:738)
at org.slf4j.jul.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
at org.slf4j.jul.JDK14LoggerAdapter.info(JDK14LoggerAdapter.java:277)
at com.wechat.api.impl.CustomerServiceImpl.sendCustomerMsgToMpUser(CustomerServiceImpl.java:167)
at com.jtexplorer.thread.WeChatMenuClickWithBookShare.sendShareHistoryToCustomer(WeChatMenuClickWithBookShare.java:95)
at com.jtexplorer.thread.WeChatMenuClickWithBookShare.run(WeChatMenuClickWithBookShare.java:77)
at java.lang.Thread.run(Thread.java:748)
分析:从上可看出当前线程属于BLOCKED状态(第一行);倒数前三行可看到出错的位置发生在类的某行,经检查出错位置为在线程中 log.info(Thread.getCurrentThread().getName())处。
从上面的代码中也看导致出错的原因是输出logo的时候出现的错误, waiting to lock<XX> 是在等待锁住某个对象,在此逻辑中log需要输出到控制台和日志文件,故猜测可能是再输出日志的时候由于抢夺对象发生的死锁。
解决办法:
百度查询可能是log4j 的问题。
解决办法与死锁原因可能不相关:由于当前项目不需要输入线程名称,故把此log删除,并将slf4j-jdk14 修改为
slf4j-log4j12,暂时未出现死锁状况。
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}