等待执行器中的所有线程完成?

2024-01-06

我正在实现并行快速排序作为编程实践,完成后,我阅读了 Executors 上的 Java 教程页面,这听起来像是它们可以使我的代码更快。不幸的是,我依靠 join() 来确保程序在所有内容都排序完成之前不会继续。现在我正在使用:

public static void quicksort(double[] a, int left, int right) {
    if (right <= left) return;
    int i = partition(a, left, right);

    // threads is an AtomicInteger I'm using to make sure I don't
    // spawn a billion threads.
    if(threads.get() < 5){

        // ThreadSort's run method just calls quicksort()
        Future leftThread = e.submit(new ThreadSort(a, left, i-1));
        Future rightThread = e.submit(new ThreadSort(a, i+1, right));

        threads.getAndAdd(2);
        try {
            leftThread.get();
            rightThread.get();
        }
        catch (InterruptedException ex) {}
        catch (ExecutionException ex) {}
    }
    else{
        quicksort(a, left, i-1);
        quicksort(a, i+1, right);
    }
}

这似乎工作正常,但如果我在调用非递归 Quicksort() 方法后立即运行 e.shutdown() ,它会出现一堆 RejectedExecutionExceptions,所以我认为这没有达到我想要的效果。

所以无论如何,我基本上试图获得与 leftThread.join() 相同的功能,但使用执行器,我的问题是:

这是等待所有线程完成的最佳方法吗?

编辑:好的,所以我弄清楚为什么在关闭执行器后出现一堆错误,这是因为我在循环中调用这个函数(以平衡运行时间)而不是创建一个新的执行器。


您使用什么类型的执行器?

ThreadPoolExecutor http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html.awaitTermination()将执行您所询问的操作(这实际上是批量连接操作)。

总而言之,ThreadPoolExecutor 将允许您设置线程数量的限制等...(如果线程计数变高,可能比像您所做的那样递归更好,不确定)。

PS - 我怀疑执行器会让你的代码运行得更快,但它们可能会让你的代码更容易阅读和维护。使用线程池将使此类算法的速度更快,并且执行器可以轻松使用线程池。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

等待执行器中的所有线程完成? 的相关文章

随机推荐

  • MVC3 远程属性 - 验证

    我有一个班级管理员 public class Admin public virtual int AdminId get set Remote UsernameAvailable Admins Display Name lblUsername
  • 当其他未缓冲的查询处于活动状态时,PDO 无法执行查询

    我知道这必须是一个简单的修复 并且我部分理解为什么会出现此错误 但不知道如何修复它 我查看了文档 但除了使用缓冲查询选项之外找不到其他解决方案 我也尝试过 但它不起作用 错误是 当其他未缓冲的查询处于活动状态时 PDO 无法执行查询 该错误
  • 跨域资源共享(CORS)概念

    我对跨域 JavaScript 的概念有疑问 有一个服务器 例如 amazon com 只有选定的域才能使用其网络服务 所以肯定的是 如果我尝试从本地使用他们的服务 我就不能 我在控制台上看到了这个 跨源请求被阻止 同源策略不允许读取 远程
  • git commit 对象数据结构的文件格式是什么?

    上下文 我希望能够搜索我的 git 提交消息和提交 而不必执行令人费解的复杂 git grep 命令 所以我决定看看 git 提交消息是如何存储的 我查看了 git 文件夹 在我看来 提交存储在 git objects git 对象文件夹包
  • ImageJ - 如何导入和显示网格?

    如何在 ImageJ 上打开并显示网格 使用 obj stl 或 dxf 格式 我尝试通过 file open 打开文件 但使用3DViewer http rsbweb nih gov ij plugins 3d viewer or the
  • Three.js 设备方向控制在加载时指向特定目标

    我正在使用 Three js 中的设备方向控件为 Google Cardboard 设置 Web 应用程序 当我加载场景时 相机的默认目标是Y方向 手机上的Z方向 那里可能没有任何物体 我想在加载之前定义一个方向 有人对如何做到这一点而不需
  • jquery 的多个 setinterval 问题

    我正在为以下代码执行 setInterval 单击按钮后 我必须一一执行以下操作 show VM started vmstart setInterval function get getVMstatus function data if d
  • 在 Websphere Portal 8 中以编程方式显式注销用户并重定向到默认登录页面

    我对 WS 门户有点陌生 并且有一个要求 其中在特定场景中我们希望用户注销并将其重定向到默认门户登录页面 我已经尝试过使会话无效清除cookies并执行response sendRedirect 如下所示响应 sendRedirect wp
  • 当用户在 Chromium 中打开新选项卡时运行指定的函数

    我想从 Chromium 的 新标签 页面中删除访问量最大的缩略图 检查该页面的内容后 我确定以下 JavaScript 行可以解决问题 document getElementById most visited remove 但我仍然有一个
  • 获取 std::wstring 的子字符串

    我怎样才能得到a的子串std wstring其中包含一些非 ASCII 字符 以下代码不会输出任何内容 文本是一个阿拉伯单词 包含 4 个字符 每个字符有两个字节 加上单词 Hello include
  • 为什么堆栈跟踪行号与源代码行号不匹配?

    我的应用程序因设备上的 NPE 崩溃 在 ACRA 收到的堆栈跟踪中 行号指的是两个源代码类 SQLiteStatement and SQLiteDatabase For SQLiteDatabase 没有任何行号与任何源代码版本中的行号匹
  • Log4j2 与 apache Ivy 依赖管理无法解析 log4j-api-java9

    当尝试将 apache log4j2 与 ivy 构建管理工具一起使用时 在尝试解决依赖项时出现以下错误 problems summary WARNINGS module not found org apache logging log4j
  • 检索 POJO 外部容器中的 servlet 上下文、会话和请求

    有没有办法从 POJO 检索会话 或者最终从 POJO 中检索 bean 澄清 基本上 我从 servlet 创建一个 bean 并且需要从 Web 容器外部 从 POJO 访问该 bean 的属性 我无法将请求传递给 pojo 并且需要请
  • matplotlib:如何刷新figure.canvas

    我不明白如何刷新FigureCanvasWxAgg 实例 这是示例 import wx import matplotlib from matplotlib backends backend wxagg import FigureCanvas
  • 根据 Windows 主题更改面板的主题(颜色)

    我想根据当前选择的 Windows 主题更改面板的颜色 我已经设置了道具 EnableVisStyles 它改变了工具栏和 Windows 窗体的标题栏等内容 但面板颜色保持不变 有什么办法可以实现这一点吗 问候 严酷的苏曼 您可能已经设置
  • 在 C# 中将委托转换为通用委托

    介绍 我使用委托来传递和存储单个表单的样式逻辑Controls 例如 我有一个委托 其中包含一些Button 样式逻辑如下 button BackColor Color Red button ForeColor Color White bu
  • 在 C 中创建字符串数组

    我想创建一个包含 N 个位置的数组 在每个位置 我想存储一个10个字符的字符串 这就是我尝试过的 在给出的示例中 N 15 但是这个数字可以改变 char userArray 10 malloc sizeof char 10 15 编译 i
  • ImageMagick 缺少解码委托

    我最近搬到 MediaTemple 并按照他们的知识库文章安装了 ImageMagick 和 IMagickhere http kb mediatemple net questions 1778 Is ImageMagick install
  • “无法在任何存储库中找到有效的 gem”(rubygame 等)

    我尝试安装这个 rubygame gem有一段时间了 但是每当我使用该命令时 gem install rubygame 它会给出一个错误 ERROR Could not find a valid gem rubygame gt 0 in a
  • 等待执行器中的所有线程完成?

    我正在实现并行快速排序作为编程实践 完成后 我阅读了 Executors 上的 Java 教程页面 这听起来像是它们可以使我的代码更快 不幸的是 我依靠 join 来确保程序在所有内容都排序完成之前不会继续 现在我正在使用 public s