我在 SO 和 Google 上搜索了这个问题的答案,但到目前为止找不到合适的解决方案。
我目前正在研究图形路由问题中的 LayerManager。管理器负责提供和重置一组固定的层。
我想使用阻止列表来实现消费者-生产者模式,以便只要没有可用的空闲层,传入的路由请求就会被阻止。目前为止我只找到了一个阻塞队列 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html但由于我们不需要先进先出、后进先出,而是随机访问,所以队列实际上不起作用。更准确地说,这样的事情应该是可能的:
/* this should be blocking until a layer becomes available */
public Layer getLayer(){
for ( Layer layer : layers ) {
if ( layer.isUnused() && layer.matches(request) )
return layers.pop(layer);
}
}
有什么办法可以实现这一点吗?
您正在寻找的称为“信号量”。
- 创建信号量类
- 将其作为字段添加到 Layer 类中
Example
public class Semaphore
{
private boolean signal = false;
public synchronized boolean take()
{
if(this.signal==true)
return false; //already in use
this.signal = true;
this.notify();
return true;
}
public synchronized void release() throws InterruptedException
{
while(!this.signal) wait();
this.signal = false;
}
public boolean isUnused()
{
return !signal ;
}
}
//2.
class Layer
{
Semaphore sem =null;
/*your code*/
/*sem = new Semaphore(); in constructors*/
public boolean take()
{
return this.sem.take();
}
public void release()
{
this.sem.release();
}
public Layer getLayer()
{
for ( Layer layer : layers )
{
if ( layer.matches(request) && layer.take())
return layer;
}
return null;
}
}
同步方法处理访问并发
3. 循环getLayer直到
Layer l=null;
while(l==null)
{
l= getlayer();
Thread.sleep(100); //set time
}
// continue
// do not forget to release the layer when you are done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)