我有以下同步方法,用于关闭任务管理器。逻辑是检查活动任务,如果有,我将等待1秒钟,然后再次检查。
但似乎发现bug插件不允许我在synchronized块中使用Thread.sleep()并发出以下警告
方法调用Thread.sleep()并保持锁定 此方法调用Thread.sleep()并保持锁定。这可能导致非常差的性能和可伸缩性,或死锁,因为其他线程可能正在等待获取锁。在锁上调用wait()是一个更好的主意,它会释放锁并允许其他线程运行。
关于如何克服这个问题的任何想法?
public synchronized void stop() {
// try to wait a bit for task shutdown
for (int i = 0; i < 5; i++) {
if (activeTaskCount == 0) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException ignore) {
}
}
if (activeTaskCount > 0) {
log.warn("Unable to shutdown all polling tasks of " + jmsConsumerName);
}
if (JMSTaskManagerState != STATE_FAILURE) {
JMSTaskManagerState = STATE_STOPPED;
}
log.info("Task manager for jms consumer " + receiveTimeout + " shutdown");
}