【问题标题】:Java collection to store multiple types of data in key value pairsJava 集合以键值对的形式存储多种类型的数据
【发布时间】:2018-02-04 09:22:12
【问题描述】:

我目前正在创建一个使用执行器和完成服务同时执行多个任务的小型框架。我有另一个独立运行的线程,它监视完成服务并每 2 秒轮询一次期货以检查结果。当任务失败时,我想通过提交回来重新执行它。我最多想重试 3 次。我现在需要一个集合,它可以让我存储任务 ID、任务对象的引用以及尝试重试的次数,这将是一个整数,同时将任务 ID 作为唯一键。目前我正在使用 2 个哈希映射。一个用于存储 ID 和引用,另一个用于存储 ID 和重试次数。

编辑我的问题是我需要一个集合的建议,它可以让我通过将任务 ID 作为唯一键来检索任务引用和重试计数比 2 更有效地存储 3 件事哈希映射。

【问题讨论】:

  • 你有什么问题?
  • 添加了问题。抱歉之前没有说清楚。
  • 我建议将任务详细信息(如任务引用和重试计数)包装在一个类(如 TaskDetail)中,并将任务 ID 存储为键,并将包装类的相应对象(任务详细信息)存储为值.
  • 但是这不会随着任务数量的增加而增加需要创建的对象的数量吗?
  • 是的,这会增加对象的数量。因此,会有一些问题,例如 1. 您的应用程序在某个时间点将执行哪些任务?你的内存能承受这么大的内存吗?当任务成功执行时,将其从地图中移除。您也可以使用 Wea​​kHashMap(完全取决于您的实际用例)。

标签: java collections concurrency


【解决方案1】:

定义一个类来保存任务和执行尝试次数:

public class ExecutionAttempt {
    private final Task task;
    private int numberOfFailedAttempts = 0;

    public ExecutionAttempt(Task task) { ... }

    public int getNumberOfFailedAttempts() { ... }

    public void countFailedAttempt() {
        numberOfFailedAttempts++;
    }

    ...
}

然后将你当前尝试执行的任务保存在一个普通的HashMap中:

HashMap<TaskId, ExecutionAttempt> currentlyRunningTaks = ...

您也可以使用Pair&lt;Task, Integer&gt;,但只要您想添加一些其他信息,例如Long averageTimeToFailure 或类似的东西,这可能很快就会失控。

我绝对不会担心那几个很小的 ​​ExecutionAttempt 对象:管理一个线程池并担心额外的十几个 ExecutionAttempt 对象就像移动货运列车并担心无法举起额外的几张纸信封。

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多