等待递归线程生产者

2024-01-08

我有一个收集器,用于搜索游戏中的动作。我以递归搜索的方式进行搜索,以获取游戏中每一个可能的动作。

出于性能原因,我使用线程池,每个找到的移动都会向池中添加一个新线程,以扩展旧的移动。

这是一些代码:

protected static List<Runnable> threads;
private static ExecutorService threadPool;

protected final synchronized void hookThread(Runnable thread) {
        if (threadPool == null) {
            threadPool = Executors.newFixedThreadPool(15);
            threads = new ArrayList<Runnable>();
        }
        threadPool.execute(thread);
        threads.add(thread);
    }

protected abstract class GathererRunnable implements Runnable {

    @Override
    public final void run() {
        onRun();
        threads.remove(this);
    }

    public abstract void onRun();

}

这是父类的一个片段。现在孩子来了,他正在寻找动作。

private void extendMove(final byte[] stones, final ByteLayMove move) {
    Runnable r = new GathererRunnable() {

        @Override
        public void onRun() {
            // fancy search stuff
            if (moveIsFound)
                extendMove(...);
        }

    };
    hookThread(r);
}

现在的问题是,我不知道应该如何等待线程完成。

我尝试使用 int,它对线程创建进行计数,对线程完成进行计数,但这也会导致搜索过早中止。

您是否知道是否有一种等待这些线程的好方法? 我已经考虑过 BlockingQueue,但我不知道如何正确实现它。

问候凯文


下面的程序使用 BlockingQueue 实现了生产者消费者场景,您可以在编写自己的实现时使用这种方法。

import java.util.concurrent.*;
public class ThreadingExample {

    public static void main(String args[]){
        BlockingQueue<Message> blockingQueue = new ArrayBlockingQueue<Message>(100);
        ExecutorService exec = Executors.newCachedThreadPool();
        exec.execute(new Producer(blockingQueue));
        exec.execute(new Consumer(blockingQueue));
    }

}
class Message{
    private static int count=0;
    int messageId;
    Message(){
        this.messageId=count++;
        System.out.print("message Id"+messageId+" Created ");
    }
}
class Producer implements Runnable{

    private BlockingQueue<Message> blockingQueue;
    Producer(BlockingQueue<Message> blockingQueue){
        this.blockingQueue=blockingQueue;
    }

    @Override
    public void run(){
        while(!Thread.interrupted()){
            System.out.print("Producer Started");
            try {
                blockingQueue.put(new Message());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Producer Done");
        }
    }
}

class Consumer implements Runnable{
    private BlockingQueue<Message> blockingQueue;
    Consumer(BlockingQueue<Message> blockingQueue){
        this.blockingQueue=blockingQueue;
    }

    @Override
    public void run(){
        while(!Thread.interrupted()){
            System.out.print("Concumer Started");
            try{
                Message message  = blockingQueue.take();
                System.out.print("message Id"+message.messageId+" Consumed ");
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }
            System.out.println("Concumer Done");
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

等待递归线程生产者 的相关文章

  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 带有模式android的EditText输入

    我有一个 EditText 我必须接受字母数字用户输入的特定于模式和连字符的输入 会自动插入 XXX XXX XXXX 如何做到这一点 安卓有什么模式工具吗 你可以通过以下方式实现图案文本观察者 https github com zsave
  • 读取csv文件并将df写入excel并使用文本换行

    我正在尝试获得以下输出 但除标题外 所有行和列均采用文本换行 import pandas as pd import pandas io formats style import os from pandas import ExcelWrit
  • 如何在 2D 和 3D 投影之间切换

    我有一个 matplotlib 图 我希望能够在 2D 和 3D 投影之间切换 我可以从 2D 转到 3D 但我似乎不知道如何转到另一条路 例子 import numpy as np from mpl toolkits mplot3d im
  • Eclipse - 更改自动完成建议的顺序

    我看到以前有人问过这个问题 但我似乎找不到我想要的 目前 在 窗口 gt 首选项 gt Java gt 编辑器 gt 内容辅助 中 我的排序建议设置为 按相关性 然而 他们似乎仍然按字母顺序排序 例如 每当我有一个HashMap我开始打字m
  • 如何将数组元素扩展为函数的单独参数

    我有一组具有动态值的颜色 这取决于数据库 现在 函数中需要这些值 该函数仅采用像此函数那样的值 para1 para2 para3 para4 其中 param1 到 param4 是数组中的颜色值 问题是我如何以上述格式将这些值解析为该函
  • 无法使用 BigQuery Python API 设置目标表

    我最近在使用 Python API 时收到以下 BigQuery 错误 google api core exceptions BadRequest 400 无法为脚本设置co nfiguration query destinationTab
  • Text[] 数组列的表索引

    我有一个 PostgreSQL 数据库表text 数组 在其上定义的列 我使用这些列以这种方式搜索数据库中的特定记录 select obj from business where street ANY address line 1 and
  • ExtJs。设置行编辑单元格值

    我有带有 RowEditing 插件的网格 编辑器有 2 列 一列带有组合框 另一列带有禁用的文本字段 我需要在更改组合框值后更改文本字段值 我有组合框监听器 listeners select function combo records
  • 在 AWS CDK 中组织安全组规则的最佳方式

    对于我的示例 我有一个 EKS 集群 RDS 数据库和一个 VPN 客户端端点 每个端点都有自己的安全组 我希望在这些安全组之间显式定义出口 入口规则 我在RDS堆栈中定义数据库安全组 导入EKS VPNaws ec2 SecurityGr
  • SQL Server:根据参数将存储过程结果插入表中

    我有一个存储过程Test Sp它以这种方式返回数据 Id Name Age Address State Country 1 ManiS 25 aaaa bbb ccc 该存储过程返回 6 列数据 但我只想将前 2 列插入临时表中 我的临时表
  • Bootstrap 3 DatePicker - 如何在不重置选择器配置的情况下重置所选日期?

    我正在尝试重置单击按钮时选定的日期 但到目前为止我只能清除input元素 选择器上没有实际日期 下面的代码重置了所有内容 包括配置和日期 所以它显然不是我需要的 datepicker datepicker update resets eve
  • 如何从曲线拟合中提取残差

    我在 Matlab R2016a 中使用曲线拟合来找到两个数组之间的最佳拟合 一个数组表示给定纬度和经度处的某个值 另一个数组表示收集该值的日期 在使用曲线拟合工具时 我能够找到一条最佳拟合线并绘制残差 我只关心残差 但是 当我将残差导出到
  • PayPal IPN 使用 PHP 生成 HTTP 302 错误

    我有一个可以运行的 IPN 脚本 并且已经工作了一段时间 最近我开始得到一个HTTP 1 1 302 Moved Temporarily作为回应 无法确定原因 以下是与发布到 PayPal 并获取响应相关的代码 sd fsockopen s
  • 使用 SQL 查询的逗号分隔值

    我的 SQL 表如下 City Code Post Code Post Code Description 100 A1 ABC 100 C8 XYZ 100 Z3 MNO 200 D4 LMN 300 E3 IJK 300 B9 RST 它
  • 在C++中,主函数是程序的入口点,我如何将其更改为其他函数?

    有人问我一个面试问题 将 C 或 C 程序的入口点从main 任何其他功能 这怎么可能 在标准 C 中 我相信 C 也是如此 您不能 至少对于托管环境不能 但见下文 该标准规定 C 代码的起点是main 标准 c99 没有留下太多争论的余地
  • 在sql查询中传递node.js参数

    我有一些从客户端接收的日期字段 基本上 我想在我的 SQL 数据库中搜索这个日期 我应该如何在查询中传递年 月和日期 我只想用从客户端收到的新日期替换该日期 如何使用 mssql 驱动程序实现此目的 https www npmjs com
  • 在 grails/hibernate 中使用 uuid 或 guid 作为 id

    我需要将 GUID UUID 作为行的 id 列 这是为了能够在线和离线创建条目 当然合并时不会在PK上产生这些冲突 我知道我可以减轻这个问题 但我想保持简单 并且有遗留应用程序已经使用 uuid guid 来定义关系 稍后还需要双向同步数
  • Oracle JDK 和 OpenJDK 之间的区别

    注意 这个问题来自 2014 年 从 Java 11 OpenJDK 和 Oracle 开始 JDK 正在趋同 Oracle 和 OpenJDK 之间有什么重要区别吗 例如 垃圾收集和其他 JVM 参数是否相同 两者之间的 GC 工作方式是
  • 变量周围的大括号

    我正在尝试理解这段代码 我什至不知道它的语法是否正确 我猜是练习的一部分 records 大括号表示什么 我见过同样的情况 但有一个 使用运算符代替 如果这有影响的话 多谢你们 The perlref 文档的 使用引用 部分 http pe
  • 等待递归线程生产者

    我有一个收集器 用于搜索游戏中的动作 我以递归搜索的方式进行搜索 以获取游戏中每一个可能的动作 出于性能原因 我使用线程池 每个找到的移动都会向池中添加一个新线程 以扩展旧的移动 这是一些代码 protected static List