Java 阻止列表实现

2024-05-11

我在 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);
    }
}

有什么办法可以实现这一点吗?


您正在寻找的称为“信号量”。

  1. 创建信号量类
  2. 将其作为字段添加到 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(使用前将#替换为@)

Java 阻止列表实现 的相关文章

随机推荐

  • 如何在 Rails 2.3.5 中从模型渲染部分

    我有一个 Rails 2 3 5 应用程序 我试图从模型中渲染几个部分 我知道 我知道 我不应该这样做 我这样做的原因是我将 Comet 服务器 APE 集成到我的 Rails 应用程序中 并且需要根据模型的事件 例如 after crea
  • 方案如何返回多个值?

    我注意到几乎所有方案函数只能返回一个列表作为输出 下面 我想返回邻居的所有相邻节点的多个值 define neighbors l w if and 1 l 1 w list and l 1 w and 1 l w how to output
  • 如果指定了多个存储库,install.packages 的行为是什么?

    从文档中并不清楚如果在 install packages 中指定了多个存储库会出现什么行为 我的直觉告诉我 它将尝试第一个存储库 如果找不到包 它将尝试第二个存储库 依此类推 不幸的是 情况似乎并非如此 我看到的是 只尝试了第一个 并返回错
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 仅使用 SQL 中的 MAX 函数更新重复行

    我有一张这样的桌子 假设为了举例 NAME是一个唯一的标识符 NAME AGE VALUE Jack Under 65 3 Jack 66 74 5 John 66 74 7 John Over 75 9 Gill 25 35 11 Som
  • SQLite3 中的“预准备”语句?

    在具有固定查询集的内存受限嵌入式系统中使用 SQLite 如果可以 预先准备 查询 则似乎可以节省代码和数据 也就是说 准备好的语句是由 相当于 sqlite3 prepare v2 在build运行时只需要调用 bind step 等 引
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • Python:在同一遍中计数和替换正则表达式?

    我可以全局替换正则表达式re sub 我可以计算匹配项 for match in re finditer count 有没有办法将这两者结合起来 以便我可以计算替换次数 而无需对源字符串进行两次传递 注意 我对替换是否匹配不感兴趣 我感兴趣
  • 如何从字符串中删除除字母、数字、空格、感叹号和问号之外的所有内容?

    如何删除除以下内容之外的所有内容 字符串中的字母 数字 空格 感叹号 问号 该方法支持国际语言 UTF 8 非常重要 您可以使用正则表达式 myString replace w s g 这将替换除单词字符 空格 感叹号或问题之外的所有内容
  • Javascript/jQuery 变量未给出预期值

    和我之前的其他人一样 我也在 Javascript 的范围内苦苦挣扎 那并试图阅读该死的东西 我已经检查了关于这个问题的一些先前的线程 但我似乎无法让它们正确地应用于我的问题 在下面的示例中 我想操纵中的值tagsArr数组 一旦数组已完全
  • 如何制作像图像中那样精确的 CSS3 线性渐变?

    For example this is gradient which I want to make in CSS3 我可以使用 1 px 图像剪切并在 x 轴上重复 就像我们之前所做的那样 但现在如果我想使用 CSS3 制作同样精确的渐变
  • 如何使用 Selenium Webdriver C# 替换 innerHTML 代码?

    HTML 代码
  • C++ 中的函数指针与仿函数

    使用函子和函数指针有什么区别 例如 Functor struct add x int x add x int y x y int operator int y return x y Function int func int x retur
  • Excel - 根据选择创建图表的宏

    我想就以下问题寻求您的帮助 因为我必须创建大量图表 所以我想要一个宏来根据我的选择插入图表 由于我对 VBA 没有任何了解 但现在需要它 至少现在 我真的应该自己学习使用它 我将感谢您的帮助 基本上 我需要知道如何调整我记录的代码 以便根据
  • 创建类路径资源中定义的名为“liquibase”的 bean 时出错.../config/DatabaseConfiguration.class

    在我的 jHipster 项目上启动嵌入式 Tomcat 时 我遇到了这个恼人的错误 花了很多时间试图解决它 但无法弄清楚为什么会发生 它是在主要代表更新项目后开始发生的 但我也实现了自定义存储库 堆栈跟踪 DEBUG uk co conf
  • SQLite 在使用之间不保存数据

    我制作了一个包含以下内容的模块 import sqlite3 as sq connection sq connect test db cursor connection cursor cursor execute DROP TABLE IF
  • #elif 定义时不带括号

    使用 VS2005 和 BLAH BLAH 定义以下预处理器条件为 false elif defined BLAH BLAH 但如果我把它改成 elif defined BLAH BLAH 是真的 为什么括号在这里会有所不同 它应该没有任何
  • 我如何在 Visual Studio 2012 中同时构建项目(dll 和 lib)

    我设法在 dll 模式和库模式下设置构建项目 但不能同时设置 对于构建在 dll 中 项目 gt 属性 gt 配置类型 动态库 dll 项目 gt 属性 gt 目标扩展名 dll 对于内置库 项目 gt 属性 gt 配置类型 静态库 lib
  • Sigar API for JAVA(需要指南)

    我已经下载了 Sigar API http support hyperic com display SIGAR Home http support hyperic com display SIGAR Home 并希望在项目中使用它来获取有关
  • Java 阻止列表实现

    我在 SO 和 Google 上搜索了这个问题的答案 但到目前为止找不到合适的解决方案 我目前正在研究图形路由问题中的 LayerManager 管理器负责提供和重置一组固定的层 我想使用阻止列表来实现消费者 生产者模式 以便只要没有可用的