【问题标题】:Java: design for using many executors services and only few threadsJava:设计为使用许多执行器服务和只有少数线程
【发布时间】:2010-06-08 11:07:48
【问题描述】:

我需要并行运行多个线程来执行一些测试。

我的“测试引擎”将执行 n 个测试,每个测试执行 k 个子测试。每个测试结果都被存储起来以备后用。

所以我有 n*k 个可以同时运行的进程。

我正在尝试弄清楚如何有效地使用 java 并发工具。

现在我有一个测试级别的执行器服务和一个子测试级别的执行器服务。

我为测试级别创建了我的 Callables 列表。 然后,每个测试可调用项将为子测试级别创建另一个可调用项列表。 调用测试可调用对象时,随后将调用所有子测试可调用对象

  • 测试 1
    • 子测试 a1
    • 子测试 ...1
    • 子测试 k1
  • 测试n
    • 子测试 a2
    • 子测试 ...2
    • 子测试 k2

调用顺序:

  • 测试管理器创建测试 1 可调用
    • test1 callable create subtest a1 to k1
    • testn callable create subtest an to kn
  • 测试管理器调用所有测试调用
    • test1 callable 调用所有子测试 a1 到 k1
    • testn callable 调用所有子测试到 kn

这工作正常,但我创建了很多新的踏板。

我无法共享执行器服务,因为我需要在执行器上调用“关闭”。

我解决这个问题的想法是为每个执行器服务提供相同的固定大小的线程池。

你认为这是一个好的设计吗? 我是否错过了更合适/更简单的方法?

【问题讨论】:

  • 问题1:为什么“需要并行运行”?表现?问题2:为什么需要关闭执行器?问题3:“提供相同的固定大小的线程池”是指为多个ExecutorServices提供一个线程池吗?
  • 为什么需要多个ExecutorService?只需使用一个并安排其上的所有任务。
  • 答案 1:是的,我需要并行运行我的测试,因为它们可以而且速度更快。 2:我错过了使用执行器服务。 3:是的,我正在使用多个执行器服务,因为可运行的子级不知道其父级的执行器。谢谢。

标签: java multithreading concurrency


【解决方案1】:

使用单个固定线程池执行器。避免调用shutdown,如果这样做可能会出错。

这里有一些伪代码,是我对发布的少量信息的最佳猜测。

main () {
    ArrayList<Future<?>> futures = new ArrayList<Future<?>>();
    ExecutorService exec = Executors.newFixedThreadPool(Runtime.getNumProcessors())
    futures.add(exec.submit(Test1));
    ...
    futures.add(exec.submit(Testn));

    for (Future<?> future:futures) {
       ? result = future.get();
    }
}

【讨论】:

  • 我正在使用invokeAll,但我误用了它;我知道这是一个异步方法,我需要调用 awaitTermination 来等待我所有的任务完成(在这种情况下,关闭是强制性的......)。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-05-18
  • 2011-06-19
  • 1970-01-01
  • 2013-08-06
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多