Java多线程-避免重复的请求处理
我有以下多线程环境场景-请求将到达一个方法,我希望避免并发请求的重复处理。因为多个类似的请求可能正在等待以阻止状态处理。我使用hashtable跟踪已处理的请求,但它会造成内存泄漏,因此应该如何跟踪已处理的请求并避免可能处于阻塞状态的待处理请求Java多线程-避免重复的请求处理,java,multithreading,Java,Multithreading,我有以下多线程环境场景-请求将到达一个方法,我希望避免并发请求的重复处理。因为多个类似的请求可能正在等待以阻止状态处理。我使用hashtable跟踪已处理的请求,但它会造成内存泄漏,因此应该如何跟踪已处理的请求并避免可能处于阻塞状态的待处理请求 如何检查任何等待/阻止的传入请求是否不是当前线程中处理的请求。如果内存泄漏是问题所在,请查看以在处理过程中保留您的请求 另一个解决方案是使用内存绑定的缓存…好的,我想我有点理解你想要什么 您可以使用ConcurrentSkipListSet作为队列。实现
如何检查任何等待/阻止的传入请求是否不是当前线程中处理的请求。如果内存泄漏是问题所在,请查看以在处理过程中保留您的请求
另一个解决方案是使用内存绑定的缓存…好的,我想我有点理解你想要什么 您可以使用
ConcurrentSkipListSet
作为队列。实现排队元素,如下所示:
class Element implements Comparable<Element> {
//To FIFOnize
private static final AtomicLong SEQ = new AtomicLong();
private final long id = SEQ.incrementAndGet();
//Can only be executed once.
private final Semaphore execPermission = new Semaphore(1);
public int compareTo(Element e){
// If element e1 exists on the queue such that
// e.compareTo(e1) == 0, that element will not
// be placed on the queue.
if(this.equals(e)){
return 0;
}else{
//This will enforce FIFO.
this.id > e.id ? 1 : ( this.id < e.id ? -1 : 0);
}
}
//implement both equals and hashCode
public boolean tryAcquire(){
return execPermission.tryAcquire();
}
}
您还可以使用此解决方案的阻塞变体(有一个有界SortedSet,如果没有元素等,则让工作线程阻塞)。没有内在的原因说明在HashMap(或您可能选择的任何其他方式)中跟踪请求会导致内存泄漏。所需要的只是一种在处理完条目后将其删除的方法 这可能意味着让您的请求处理线程:
- 直接删除条目李>
- 向调度员反馈信息;或
- 将请求标记为已处理,以便 调度器可以删除这些条目
while(!Thread.currentThread().isInterrupted()){
//Iterates from head, therefore simulates FIFO
for(Element e : queue){
if(e.tryAcquire()){
execute(e); //synchronous
queue.remove(e);
}
}
}