我有一个使用多线程续订服务的程序。
我的程序有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)已锁定
在日志文件中。
你能给我一些建议吗?对不起我的英语不好。 非常感谢。