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

Java调度线程池执行器对某些条件进行初始延迟对某些值进行检查

淳于知
2023-03-14

问题:

我有一个任务,它必须在每个任务运行后以固定的延迟定期运行。另外,我有一个条件,在初始延迟或第一次执行应该发生在一个条件满足后。因此,执行器必须阻止调度任务,直到满足条件为止。

Java并发包为我们提供了ScheduledThreadPoolExecutor,它具有初始延迟的选项。但在我的例子中,初始延迟是在某个条件或值改变为所需的条件或值之后。

我如何实现这个行为以及我应该使用什么executorservice或者我可以重写executorservice中的什么方法来实现上述行为。

我不想只在满足条件之后才开始创建ScheduledThreadPoolExecutor对象,原因是我们的应用程序中存在大量这样的定期调度任务,如果下一次添加了任何新任务,并且如果它们忘记在进行检查的代码部分中添加,那么它将被立即调度,而不进行任何条件检查。为了避免这种情况,我想要一个executor服务来为我处理它,下次任何使用这个executorservice的人都将在默认情况下免费获得这种行为。

感谢任何帮助。

谢谢你

共有1个答案

阮轶
2023-03-14

我不认为您会找到现成的ExecutorService来处理您的用例。所以为什么不这样做呢?创建扩展ScheduledThreadPoolExecutor的自定义类,然后重写beforeExecute方法,然后编写代码检查首次执行(使用自定义标志检查是否首次执行),而对于其他调用,它将执行正常的可运行对象。类似于下面的代码:

import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestClass extends ScheduledThreadPoolExecutor {

public TestClass(int corePoolSize) {
    super(corePoolSize);
}

@Override
protected void beforeExecute(Thread t, Runnable r) {
    super.beforeExecute(t, r);
}

@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
    return super.schedule(command, initialDelay, TimeUnit.MILLISECONDS);
}
}
 类似资料:
  • 这是函数 这些是我的按钮:

  • 问题内容: 我有一些已经在使用的JBoss webapp,还有一个懒惰的初始化问题。因此,建议我在Spring进行调查并使用。 但是,我仍然会收到错误消息,希望您能对我有所帮助?要使用Spring OEM过滤器,我还需要在应用程序中进行哪些更改? 我的设置是这样的: + jsf的东西。 我将其设置如下:web.xml applicationContext.xml: persistence.xml:

  • 问题内容: 和骗局。如何按升序排序,然后按?有人可以帮忙吗?我知道在中具有通用算法和重载运算符,但是我是Java新手。 问题答案: 使实现或在单独的类中实现。然后致电: 要么 通常,如果有一个单一的“自然”排序顺序,则实施是个好主意…否则(如果你碰巧想要按特定顺序进行排序,但可能同样容易地希望使用另一个顺序),则最好实现。老实说,这种特殊情况可能会发生任何一种……但是我可能会坚持使用更灵活的选择。

  • 我需要帮助设计基于多线程的应用程序,包括动态url创建和线程处理。 我在我的应用程序中使用了一个Spring调度器,它每30秒调度一次。从这个调度方法中,我调用了一些基于服务的api,它在循环中,而且我需要每个API有一个线程池执行器,上面有一个线程处理。 由于这个过程是从计划方法开始的,所以每次创建新的线程池时,这就是问题所在。你可以在代码中看到。 我想要的是,如果对于任何一个应用编程接口,如果

  • 我需要延迟处理一些事件。 我有三件事(发表在Kafka上): A(id: 1, retry At: now) B(id: 2, retry At: 10分钟后) C(id: 3, retry At: now) 我需要立即处理记录A和C,而记录B需要在十分钟后处理。这在Apache Flink中实现可行吗? 到目前为止,无论我研究了什么,“触发器”似乎都有助于在Flink中实现它,但还没有能够正确实

  • 最初,我在运行拓扑时只分配了1个executor给QueryNormalizer。执行潜伏期为8.952,处理潜伏期为12.857。 为了更快,我将QueryNormalizer中的执行程序数更改为4。执行延迟更改为197.616,处理延迟更改为59.132。 根据执行延迟的定义-元组在执行方法中花费的平均时间。execute方法可以在不发送元组的Ack的情况下完成。 此外,处理延迟是否应始终低于