代码之家  ›  专栏  ›  技术社区  ›  Marta Karas

设计模式以确保池仅执行一个具有特定id值的Runnable对象

  •  5
  • Marta Karas  · 技术社区  · 10 年前

    假设我有一个有序的列表 Runnable 要由执行的对象 ExecutorService 我的 可运行的 对象具有 userID 归档-假设我有 20 不同的 userId -s和 10 是池中的线程数( 执行器服务 对象)。

    什么是一般设计模式,以确保最多1 可运行的 特定组的对象是否同时在其中一个线程中执行?(目标是 可运行的 来自一个id组的命令应该以cronological和同步方式执行)。

    2 回复  |  直到 10 年前
        1
  •  2
  •   gadget    10 年前

    您可以为每个组创建队列,当任务终止时,您可以读取相应的队列,并在需要时提交下一个任务。

    为此,您需要确定Runnable何时终止。对于标准的JDK类,您不能以简单的方式实现这一点,而是使用 Guava 库,您可以将ExecutorService包装为ListeningExecutorServices。如果您通过此包装器提交任务,它将返回 ListenableFuture 而不是简单的Java Future。ListenableFuture将允许您注册将在任务终止时执行的回调。在这些回调中,您可以检查队列并提交同一组中的下一个任务。

        2
  •  0
  •   Alexei Kaigorodov    5 年前

    对于每个Id,您需要一个轻量级的SerialExecutor,如中所述 JavaDocs of Executor 该实现不是最优的——对于每个输入任务,它都会创建额外的服务Runnable。优化版本可在 https://github.com/akaigoro/CodeSamples/blob/master/src/main/java/actor/serialexec/SerialExecutor.java ,其中SerialExecutor充当中间可运行程序,并在空闲时重新提交自己,并出现新任务。