java - 根据token延迟提交任务

标签 java multithreading guava callable

伙计们。我有一项任务无法解决,因为我对多线程还很陌生。我想编写一个类来维护以下语义:

interface TokenAwareTaskExecutor(){
   //Callable<Long> returns the time the task finishes.
   public void submitTask(String token, Callable<Long> task);
   public long getDelay();
}

在提交任务时,服务会查找之前的调用是否已添加此类 token 。如果是这样,则应在延迟后并在执行任何其他具有相同 token 的已提交任务之后提交任务。如果不存在这样的 token ,请添加它并立即提交任务。总而言之,我想实现一种负载平衡策略,允许独立处理具有给定频率的唯一 token 。你能指导我看什么吗?

最佳答案

实现将涉及以下事情:

  1. 需要存储已提交的 token 以及这些 token 请求的状态:为了实现这一点,我将创建一个包含 token 名称、上次请求状态、提交时间和最后一次结束时间的内部类要求 。我将使用 ConcurrentHashmap 将相应的字符串标记存储为键,并将每个 bean 的实例存储为值,并且,每当有请求进入时,我将通过使用同步块(synchronized block)来锁定该 bean。

  2. 每次收到请求时,它都会检查 map 中是否存在 token 条目,如果不存在,它将创建一个条目并继续执行任务。如果存在条目,它将尝试获取 bean 实例上的锁,这意味着如果已对 bean 进行锁定,那么它将等待。

  3. 一旦一个请求完成了它的工作,它会在释放锁之前在相应的 bean 中更新它的状态。

以上 2 点基本上为实现设置了一个 freamork,你可以扩展它来实现其他方面,比如如果出现超过 2 个的多个请求,然后按顺序排队 [你可以使用公平锁],如果你想要在多个请求之间添加任何额外的延迟,然后也可以这样做

关于java - 根据token延迟提交任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15852314/

相关文章:

java - 从 NetBeans 执行上下文获取资源有效,但从命令行执行 jar 时无效

c++ - 谷歌测试中的使用线程

java - 用 Guava 替换通用集合的兼容性问题

java - JUnit 为 com.google.common.collect.Iterables.tryFind 抛出 java.lang.NoSuchMethodError

c - 如何确保函数中创建的所有线程在同一函数终止之前返回?

java - ImmutableMap 构建器如何创建抽象类的实例?

java - 是否可以在同一事务中捕获运行时异常并引发应用程序异常? (ejb)

java - Java 编译器如何解析类型转换?

java - MapReduce 计数并求平均值

multithreading - 最大并发线程数小于max-thread-pool-size