在服务器端,我创建了一个非停止线程(在run方法中使用无限循环),它命名为Event提取器,它扩展了java Observable。
当我调用notifyObservers方法时,它工作正常。但在某些时候线程已被锁定。
是否有人帮助我解决此问题。我已经分享了以下代码
public class EventExtractor extends Observable implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(NOTIFY_DELAY); // 60000 milliseconds
} catch (InterruptedException e) {
Logs.error("InterruptedException in run() in Extractor",e);
}
Set<String> productSet= getProductSet();
this.setChanged();
/* notify the products to observer */
this.notifyObservers(productSet);
/* clear the set to maintain the products again for a minute */
Set<String> productSets= getProductSet();
if (productsSets != null) {
productsSet.clear();
}
}
}
}
public class FMListener implements Observer{
public void update(Observable arg0, Object arg1) {
Set<String> set = (Set<String>) arg1;
for (String ProductID: set) {
LOGS.debug("***** obj is:::: " + ProductID);
//call Http request calls to particular product and update into data base
httpClient.sendRequest(***URL**);
}
}
getProductSet()是一种静态方法,用于在从产品接收事件时添加产品
答案 0 :(得分:0)
是什么让你觉得它是一个“死锁”。当你认为它处于“死锁”并且发现主线程在等待什么时,你是否尝试进行线程转储?
我怀疑它实际上是死锁的原因是,没有明显的锁定发生,最重要的是,Java的Observer逻辑不会产生任何新线程:观察者的逻辑只是在你的调用者线程上下文中运行,这意味着,在你的情况下没有其他线程,因此,仅仅通过上面的逻辑,没有理由有死锁
您使用的HTTP客户端可能不是线程安全的,而且还有其他人在使用它。但是我认为它更可能是一些未被捕获的异常(可能来自你的观察者逻辑)使你的EventExtractor线程死亡。