2013-03-28 68 views
0

我有一个程序,其中许多线程将他们的请求发布到PriorityQueue。 后来,他们等待ConcurrentSkipListMap的回复。有一个线索发布ConcurrentSkipListMap的答案。Java - 是否可以同步ConcurrentSkipListMap上的线程?

的下面几行代码说明这一点:

在程序初始化

PriorityQueue<Request> requests = new PriorityQueue<Request>(); 
ConcurrentSkipListMap<Long, Reponse> responsesReceived = new ConcurrentSkipListMap<Long, Reponse>(); 

在调用程序线程

// Send request ... 
Request r = ... // Elaborate the request 
requests.add(r); 

// ... then wait for an answer 
Long id = r.getId(); 
while (responsesReceived.containsKey(id) == false) { 
    synchronized (responsesReceived) { 
     responsesReceived.wait(); 
    } 
} 

Answer a = responsesReceived.take(id); 

// Do other things ... 

在响应处理线程

// Wait for a remote answer 
Answer answer = ...; 

// Once received publish it in ConcurrentSkipListMap 
responsesReceived.put(answer.getRequestId(), answer); 

synchronized (responsesReceived) { 
    responsesReceived.notify(); 
} 

// Go back and wait for a new answer... 

问题

  • 它是安全的同步上ConcurrentSkipListMap呼叫者线程和响应处理线程?
  • 我是否应该使用Lock进行同步?
  • 我应该使用锁的HashMapHashMap<Long,Object>)吗?

我用的java.util.concurrent API相当新的,我有些怀疑......

回答

0

虽然这可以工作,也未必代表你在做什么,最清晰的方式。我会为这些通知添加一个单独的“锁定”对象。

注:我会使用notifyAll(),除非你只有一个等待线程。

1

通过synchronized/wait/notify,您可以使用任何对象作为锁。至于将作业提交到队列并等待其结果,请参阅ExcutorServiceFutureCompletionService

+0

+1因为使用ExecutorService很可能是更好的解决方案。 – 2013-03-28 10:13:19