gpt4 book ai didi

Java 阻止列表实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:37:25 25 4
gpt4 key购买 nike

我在 SO 和 Google 上搜索了这个问题的答案,但到目前为止找不到合适的解决方案。

我目前正在研究图形路由问题中的 LayerManager。管理器负责提供和重置一组固定的图层。

我想用一个阻塞列表来实现消费者-生产者模式,这样只要没有空闲层可用,传入的路由请求就会被阻塞。到目前为止我只找到了一个 blocking queue但是由于我们不需要 FIFO、LIFO 但随机访问队列并不真正起作用。更准确地说,像这样的事情应该是可能的:

/* 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);
}
}

有什么办法可以实现吗?

最佳答案

你要找的东西叫做“信号量”。

  1. 创建一个信号量类
  2. 将其作为字段添加到 Layer 类

例子

 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

关于Java 阻止列表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29889649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com