使用Java Observer时发生线程死锁

时间:2013-12-13 06:44:27

标签: java multithreading java-ee thread-safety deadlock

在服务器端,我创建了一个非停止线程(在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()是一种静态方法,用于在从产品接收事件时添加产品

1 个答案:

答案 0 :(得分:0)

是什么让你觉得它是一个“死锁”。当你认为它处于“死锁”并且发现主线程在等待什么时,你是否尝试进行线程转储?

我怀疑它实际上是死锁的原因是,没有明显的锁定发生,最重要的是,Java的Observer逻辑不会产生任何新线程:观察者的逻辑只是在你的调用者线程上下文中运行,这意味着,在你的情况下没有其他线程,因此,仅仅通过上面的逻辑,没有理由有死锁

您使用的HTTP客户端可能不是线程安全的,而且还有其他人在使用它。但是我认为它更可能是一些未被捕获的异常(可能来自你的观察者逻辑)使你的EventExtractor线程死亡。