我有一个程序,其中许多线程将其请求发送到 PriorityQueue
。
随后,他们等待 ConcurrentSkipListMap
的回复。 。有一个线程发布了 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
上同步调用者线程和响应处理程序线程是否安全? ? - 我应该使用锁进行同步吗?
- 我应该使用
HashMap
锁(HashMap<Long,Object>
)?
我对 java.util.concurrent API 还很陌生,我有一些疑问......
最佳答案
通过synchronized/wait/notify,你可以使用任何对象作为锁。至于将作业提交到队列并等待其结果,请查看 ExcutorService
、Future
和 CompletionService
。
关于Java - 在 ConcurrentSkipListMap 上同步线程是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15678984/