当前位置: 首页 > 知识库问答 >
问题:

等待SchduledExecutorService中的所有作业完成,同时允许添加新作业

郎宣
2023-03-14

我使用ScheduledExecutorService跨多个线程调度和处理作业。在我的应用程序中,作业可以安排新作业(在相同的ScheduledExecutorService上),作为某种后续操作。

在主线程中,我想等到所有作业都完成,作为同步点。有关闭()waitTeroration()方法,但这不允许任何正在运行或挂起的作业安排新作业。在我的情况下,我实际上希望允许这样做,接受我们永远不会完成(或遇到一些超时)的风险。

我如何等待所有工作以及后续工作完成?

共有1个答案

邹祺
2023-03-14

可以跟踪活动作业的数量。实际上,您提交的每个作业必须包装如下(伪代码):

increase active jobs by one
try {
    run actual job
} finally {
    decrease active jobs by one
}

当然,ScheduledExecutorService需要完全封装才能工作。

下一步是找到合适的并发机制,它不会引入任何繁忙的等待。

在发出不再有作业信号的条件下,快速而肮脏地尝试使用锁:

private final Lock lock = new ReentrantLock();
private final Condition noJobs = lock.newCondition();

private long jobCount = 0;

private void increaseJobCount() {
    lock.lock();
    try {
        jobCount++;
    } finally {
        lock.unlock();
    }
}

private void decreaseJobCount() {
    lock.lock();
    try {
        jobCount--;
        if (jobCount == 0) {
            noJobs.signalAll();
        }
    } finally {
        lock.unlock();
    }
}

public void awaitNoJobs() throws InterruptedException {
    lock.lock();
    try {
        while (jobCount > 0) {
            noJobs.await();
        }
    } finally {
        lock.unlock();
    }
}

我检查了一些其他已知的并发类,但除了BlockingQueue之外,我找不到任何类。但这些会占用更多内存,因为您必须为提交的每个作业添加和删除一些内容。CountDownLatch接近,但不允许增加计数。

 类似资料:
  • null 如何调用API来验证作业是否已完成,并获取已保存导出的URL? 谢了。

  • 问题内容: 我目前正在等待所有承诺按顺序完成,如下所示: 但是,通过这种方式,配置文件和令牌将顺序执行。由于两者彼此独立,因此我希望两者一起独立执行。我认为可以使用Promise.all完成此操作,但是我不确定语法,也找不到任何帮助。 所以我的问题是如何转换上面的api调用以一起运行,然后返回最终输出。 问题答案:

  • 我想在C#中处理子目录和文件的文件系统/文件夹。我正在使用TPL库中的任务。这个想法是递归地执行它并为每个文件夹创建一个任务。主线程应该等待子线程完成,然后打印一些信息。事实上我只是想知道扫描何时完成。我已经开始使用线程池,然后切换到TLP。做了一些简单的例子。经过一些尝试从简单的代码到越来越臃肿的代码我被困在这里: 主线程有时仍然过早地继续,而不是在完成所有其他线程之后继续。(我对C#比较陌生,

  • 我正在Eclipse中使用Java运行selenium RC。我遇到的问题是selenium.click命令。我点击的链接加载一个新页面。有时需要5秒,有时需要2-3分钟。每次我看到页面加载时,在我的测试失败后,我立即得到消息“Timed out waiting for action to finish”。 我尝试使用Selenium.IsElementPresent检查正在加载的页面。但是,当我

  • 他说,我有一个问题,我需要发送多个AJAX调用到同一个URL,但数据不同。我需要将其分块发送,并等待所有请求完成,然后再执行每个函数。 我做了一个简单的区块函数,将我的数组切片并将其分为多个组。 我的代码: 我需要在最后得到一个完整的数组来保存我所有的resp数据 我不能做$。当(),因为我不能命名函数,我也不知道如何使用$。deverred()在这个函数中你能帮我吗? 谢谢

  • 问题内容: 我将Groovy脚本作为Jenkins中Pipeline工作的一部分,如下所示: 由于将标记设置为,因此它并行执行多个其他自由式作业。但是,我希望所有作业完成后才能完成呼叫者作业。目前,Pipeline作业会触发所有作业并在几秒钟后自行完成,这不是我想要的,因为我无法跟踪总时间,而且我无法一次取消所有已触发的作业。 当并行完成所有作业时,如何纠正上述脚本以完成管道作业? 我试图将构建作