在多线程java

时间:2016-08-26 11:34:41

标签: java multithreading

我有一个使用多线程续订服务的程序。

我的程序有1个线程用于检索订阅者(Retriever)然后推送到队列,以及一些线程用于从队列获取子服务以更新服务(Worker)。如果更新错误,检索器将再次将其推送到队列。 Retriever循环无限,如果队列为空,它会将订阅者推入队列,否则,它将在几秒钟内休眠。 如果没有任何队列,工人将在几秒钟内睡觉。 我的问题是:有时,订户的服务由多个工人续订多次。我尝试使用hashmap锁,但它仍然是错误的。

这是我的对象锁代码:

public class ExtendServiceLockObj {
    static  Map lock = new HashMap();

    static synchronized boolean isLocking(String msisdn) {
        if (lock.containsKey(msisdn)) {
            return true;
        }
        return false;
    }

    static synchronized void put(String msisdn, long id) {
        lock.put(msisdn, new Long(id));
    }   

    static synchronized void remove(String msisdn) {
        lock.remove(msisdn);
    }
}

这是我的工作人员代码:

public void run() {
        try {
            while (running) {
                try {
                    -- if it can pull subscriber from queue
                    if (ExtendServiceLockObj.isLocking(msisdn)) {
                            logger.error("Renew_SERVICE (" + msisdn
                                    + ") locked");                          
                            continue;
                    }else{
                        -- Renew service
                        try {
                            ExtendServiceLockObj.put(msisdn, id);
                            -- do something
                            -- if renew successfully
                            ExtendServiceLockObj.remove(msisdn);
                        }catch (Exception){
                            ExtendServiceLockObj.remove(msisdn);
                        }
                    }
                }
                catch (Exception e){                
                    -- write log
                    ExtendServiceLockObj.remove(msisdn);
                }
            }
        }catch (Exception ){
            -- write log            
        }
}

我的猎犬代码:

try {
    while (running) {
        if (queue.isEmpty()) {
            try {
                while (running) {
                -- query database to get subscribers
                -- try to enqueue
                }
            }catch (Exception ){}
        }
        Thread.sleep(interval);
    }
}catch (Exception e){
}

我将ArrayBlockingQueue用于我的程序。

  

queue = new ArrayBlockingQueue(MAX_QUEUE_SIZE,true);

有时候我可以看到

  

Renew_SERVICE(#msisdn)已锁定

在日志文件中。

你能给我一些建议吗?对不起我的英语不好。 非常感谢。

0 个答案:

没有答案