如何保证 ThreadPoolExecutor 中的 FIFO 执行顺序

2024-01-09

我用这行代码创建一个 ThreadPoolExecutor :

private ExecutorService executor = new ThreadPoolExecutor(5, 10, 120, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20, true));

然后,我运行 25 个任务(T01 到 T25),所以情况是:

  • 当前正在运行 5 个任务(T01 至 T05)
  • 20 个任务在队列中等待(T06 至 T25)

当我再放入 1 个任务 (T26) 时,由于队列已满,我预计旧任务 (T06) 会被删除以启动(因为未达到 MaxPoolSize),而新任务 (T26) 会被放置在队列的末尾。队列。

但在现实生活中,如果Queue已满并且MaxPoolSize未达到,newest任务开始。

所以我有 ...

  • 当前正在运行 6 个任务(T01 至 T05 和 T26)
  • 20 个任务在队列中等待(T06 至 T25)

... 代替 ...

  • 当前正在运行 6 个任务(T01 至 T06)
  • 20 个任务在队列中等待(T07 至 T26)

我可以配置 ThreadPoolExecutor 以获得预期结果吗? 我应该使用其他课程吗?

有关信息,请参阅 ThreadPoolExecutor 源代码的一部分

public void execute(Runnable command) {
    if (command == null)
        throw new NullPointerException();
    if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
        if (runState == RUNNING && workQueue.offer(command)) {
            if (runState != RUNNING || poolSize == 0)
                ensureQueuedTaskHandled(command);
        }
        else if (!addIfUnderMaximumPoolSize(command))
            reject(command); // is shutdown or saturated
    }
}


private boolean addIfUnderMaximumPoolSize(Runnable firstTask) {
    Thread t = null;
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        if (poolSize < maximumPoolSize && runState == RUNNING)
            t = addThread(firstTask);
    } finally {
        mainLock.unlock();
    }
    if (t == null)
        return false;
    t.start();
    return true;
}

Thanks


我会让核心尺寸等于最大值。这就是大多数池的使用方式,我不确定在您的情况下什么时候会出现缺点,但您会按顺序执行任务。

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

如何保证 ThreadPoolExecutor 中的 FIFO 执行顺序 的相关文章

随机推荐

  • Windows 的二元决策图库

    尝试获得后jinc http www jossowski de projects jinc jinc html在 Windows 下编译并很快遇到数百个编译器错误 我正在寻找将为 Windows 构建的高质量 BDD 库 最好是 C 或 C
  • Laravel 5.2 身份验证 - 如何在每个页面中显示登录用户名和注销链接?

    Laravel 5 2 身份验证 我使用 Laravel 5 2 创建了一个新的身份验证脚手架 php artisan make auth 一切都很完美 除了即使在我在途中登录后我也会收到登录 注册链接 但当我在途中时 它会显示带有注销链接
  • ElasticSearch如何查询最长的任务

    我在 Elastic Search 中有以下格式的数据 POST slots slot 1 taskId 1 datetime 2020 05 10T08 45 44 status START POST slots slot 2 taskI
  • “node_modules”文件夹的用途是什么?

    到底是什么节点模块文件夹以及它的用途是什么 我知道当我们下载任何库时npm 库转到文件夹节点模块 我还知道 当我们要上传它 例如上传到 GitHub 时 我们必须忽略节点模块文件夹 因为它占用大量空间 通过文件包 json我们可以使用下载所
  • 在第 0 行的“C:\”中找不到路径的一部分

    我遇到了一个错误Script Task in SSIS package 我可以找到类似的问题 但它们与我的情况不同 构建脚本失败并出现以下错误 有关错误列表 请参阅下图 严重性代码 说明 项目文件行抑制状态 错误 找不到路径的一部分 C U
  • Scala 的扩展性是否比其他 JVM 语言更好?

    这是我目前知道的唯一提问方式 据了解 Scala 使用 Java 虚拟机 我以为朱比也这么做了 Twitter 将其中间件切换为 Scala 他们可以做同样的事情并使用 Jruby 吗 他们是否可以从 Jruby 开始 而不会因为扩展问题而
  • 隐藏/保护 php-engine 配置文件的最佳实践?

    我刚刚接到一项任务 需要开发一个旧式开发的网页 这意味着 常用的变量 常量和数据库连接变量都在查看php engine中 而不是在单独的文件中 我想我会将它们放入 config php 或 config inc 文件中 然后与 requir
  • 无法将登录页面重定向到安全页面

    我有一个使用 php 创建的登录页面 但在正确登录后无法将其带到管理页面 我知道我使用的登录名是正确的 因为我刚刚创建了它 如果它是错误的 它应该告诉我 然而 一旦我登录 整个页面就变成空白 网址显示我仍在登录页面而不是管理页面 我检查了错
  • 在 OpenAPI 2 中等效使用 oneOf(来自 OpenAPI 3)

    我怎样才能调整这个片段oneOf到等效的 OpenAPI 2 0 版本 formats type array description Possible parameter format items oneOf type string typ
  • kzalloc() - 单次调用的最大大小?

    我们可以在一次调用中使用 kzalloc 分配的最大大小是多少 这是一个非常常见的问题 另外 如果我可以验证该值 请告诉我 上限 在单个 kmalloc kzalloc 请求中可以分配的字节数 是以下函数 处理器 实际上是页面大小 以及 好
  • 如何将两个mySQL数据库合并为一个?

    我有两个数据库 每个数据库包含不同的表 leave sql 和 crm sql 我想将所有休假表转移到 crm 数据库中 我该怎么做呢 如果其他数据库具有与叶子数据库不同的表 那么您所需要做的就是将数据导入到 crm 数据库中 最后 确保您
  • plot() 和 do.call():当使用“...”时,如何将表达式传递给绘图标题?

    当运行以下代码时 我得到Error in as graphicsAnnot text could not find function bold 我怎样才能解决这个问题 my qq lt function x main expression
  • jQuery:如何制作可折叠的树导航?

    我有标题 每个标题都有子项目 当我单击标题时 我希望它切换查看或显示标题内容 这是我到目前为止所拥有的 j h2 click function if j this next is hidden j this next show else j
  • Flutter:如何修复底部溢出

    我有一个带有列布局的 Flutter Widget 它有两个容器 其中一个有一个ListView builder 当页面呈现时我得到一个 底部溢出 169px 我不知道如何解决它 我在谷歌上搜索了解决方案 并尝试了各种方法 例如包装一个或多
  • 如何找到缺失的行?

    我有两个相同的表 A 和 B 这两个表具有相同的字段 例如表 A bin storage plant 和 B bin storage plant 但是当我检查数据时 表A有5238行 B表有5249行 所以我不知道缺少哪11行 我需要帮助来
  • UITableViewCell 内的 UICollectionView

    我注意到 iOS 在使用时非常卑鄙UICollectionView里面一个UITableViewCell 我想要实现的目标是拥有一组图像 UICollectionView方法 内UITableViewCell 我正在尝试模仿 Faceboo
  • IOS - 从应用程序商店安装旧版本的应用程序

    两天前我发布了应用程序的更新 从那时起 我从用户那里听说他们正在使用旧版本的应用程序 真正奇怪的是 用户在应用商店中看到了新的应用描述和屏幕截图 我已经弄清楚如何可靠地重现该问题 这是我可以自己解决的问题吗 我已经联系了苹果公司并在网上进行
  • 在 OS X 10.9 上找不到“ext/slist”文件

    我正在尝试让一些旧的第三方软件在 OS X 10 9 上编译 我通过调整 Makefile 中的设置设法摆脱了大多数编译问题 这些文件最初是为gcc大概是在 2005 年左右 但是 我目前不知道如何克服 C 源文件的这个错误 utility
  • 注入返回字符串 CDI 的生产者方法

    我想使用 CDI 将常量字符串消息注入 JSF Web 应用程序中的托管 bean 这里是生产者类 Named RequestScoped public class StringProducer Produces Named message
  • 如何保证 ThreadPoolExecutor 中的 FIFO 执行顺序

    我用这行代码创建一个 ThreadPoolExecutor private ExecutorService executor new ThreadPoolExecutor 5 10 120 TimeUnit SECONDS new Arra